配置:
<cacheModel type="LRU" id="user-cache">
<flushInterval hours="24"/>
<flushOnExecute statement="user.addUser"/>
<flushOnExecute statement="user.updateUser"/>
<flushOnExecute statement="user.deleteUser"/>
<property name="cache-size" value="50000"/>
</cacheModel>
<select id="getAll" resultClass="user" parameterClass="java.util.HashMap" cacheModel="user-cache">
select * from user limit 0,#size#
</select>
测试代码:
Map<String, Object> map = new HashMap<String, Object>();
map.put("size", 8);
// first time no cache
Long startTime = System.currentTimeMillis();
List<User> list = (List<User>)sqlMap.queryForList("user.getAll", map);
System.out.println("No cache pass time:" + (System.currentTimeMillis() - startTime));
// second time has cache
map.put("size", 8);
startTime = System.currentTimeMillis();
list = (List<User>)sqlMap.queryForList("user.getAll", map);
System.out.println("Has cache pass time:" + (System.currentTimeMillis() - startTime));
结果:
No cache pass time:485
Has cache pass time:0
打开ibatis的日志,会发现第二次执行没有sql语句输出。
注意:
CacheModel缓存的是statement,即key是跟sql语句相关,如果sql语句不一样,将产生两个cache,如第二条将使用不到缓存,但第三条可以使用缓存:
select * from user limit 0,4 新建缓存
select * from user limit 0,8 新建缓存
select * from user limit 0,8 使用缓存
简单源码分析:
以queryForList为例:
SqlMapExecutorDelegate具体实现:
list = ms.executeQueryForList(statementScope, trans, paramObject, skip, max);
这里ms为MappedStatement,其中CachingStatement是它的子类。
CachingStatement具体实现:
public List executeQueryForList(StatementScope statementScope, Transaction trans, Object parameterObject, int skipResults, int maxResults)
throws SQLException {
CacheKey cacheKey = getCacheKey(statementScope, parameterObject);
cacheKey.update("executeQueryForList");
cacheKey.update(skipResults);
cacheKey.update(maxResults);
Object listAsObject = cacheModel.getObject(cacheKey);
List list;
if(listAsObject == CacheModel.NULL_OBJECT){
// The cached object was null
list = null;
}else if (listAsObject == null) {
list = statement.executeQueryForList(statementScope, trans, parameterObject, skipResults, maxResults);
cacheModel.putObject(cacheKey, list);
}else{
list = (List) listAsObject;
}
return list;
}
分享到:
相关推荐
本文将通过分析iBatis的源码,深入探讨其设计理念和实现机制。 一、iBatis架构概述 iBatis主要由SqlMapConfig.xml配置文件、SqlMap接口和Executor执行器三大部分构成。SqlMapConfig.xml配置文件定义了数据源、事务...
通过深入分析iBATIS的源码,开发者不仅可以了解其工作原理,还能学习到设计模式、数据库访问的最佳实践以及如何优雅地处理数据库操作。对于提升Java开发者的技能和理解数据库访问层的实现有极大的帮助。在实际开发中...
描述中的"ibatis框架源码剖析书中附带的光盘,ibatis源码分析"暗示这可能是一个学习资源,用于深入理解iBATIS的工作原理,可能包括了对源码的详细解读和分析。 **iBATIS核心知识点** 1. **SQL映射**:iBATIS的核心...
接下来,关于源码分析: 1. 源码阅读:源码中包含Ibatis的所有核心组件,如SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession等。通过阅读源码,可以深入了解其工作原理,例如如何加载配置文件、如何创建和...
源码分析部分,我们可以看到iBATIS如何解析XML配置文件,如何通过反射机制调用Java方法,以及如何将查询结果自动映射到Java对象上。这对于理解iBATIS的工作流程及其内部机制至关重要。 在"iBATIS开发指南电子书"中...
3. **Executor**:执行器是iBATIS的核心组件,负责处理SQL的执行,包括简单执行、批量执行和缓存管理。 4. **ParameterMapping**和**ResultMapping**:这两个概念定义了如何将Java对象的属性与SQL语句中的参数和...
本文将详细讲解如何将iBatis与Memcached整合,以及相关的源码分析和文档资料。 首先,我们需要了解iBatis和Memcached的基本概念。iBatis允许开发者将SQL语句直接写在配置文件中,通过Java接口和XML映射文件将数据层...
《深入解析iBatis 2.3源码》 iBatis,作为一款经典的Java持久层框架,以其轻量级、灵活的特性深受开发者喜爱。...在实际项目中,结合源码分析,能够更好地定制和扩展iBatis,满足特定的业务需求。
总的来说,iBATIS DAO 2.3.4.726版的源码分析对于学习和理解Java中的持久层设计有极大的帮助。通过阅读和理解源码,开发者不仅能掌握iBATIS DAO的基本使用,还能深入了解其内部实现,提升数据库操作的技巧和优化能力...
9. **缓存机制**:Ibatis提供了本地缓存和二级缓存,学习如何配置和使用缓存,可以有效地减少数据库访问,提升应用性能。 通过赖家才老师的源码学习,你可以亲手实践这些知识点,加深理解并掌握Ibatis的精髓。同时...
Ibatis,全称为MyBatis,是一个优秀的Java持久层框架,它主要负责简化数据库操作,使得开发者能够将注意力集中在编写SQL...通过使用这个jar包,开发者可以轻松地集成Ibatis到自己的项目中,享受其带来的便利和优势。
一、**IBatis源码分析** IBatis的源码是开源的,这对于开发者来说是一份宝贵的资源,可以让我们深入了解其工作原理和内部机制。通过阅读源码,我们可以学习到以下知识点: 1. **动态SQL**:IBatis的核心功能之一...
通过分析这个案例,我们可以学习到如何在实际开发中设计和实现SQL映射文件,以及如何在Java代码中调用iBatis接口来执行SQL语句。 此外,源代码部分是学习iBatis的重要资源。通过对源码的学习,我们可以了解iBatis...
8. **源码分析**:深入Ibatis源码,理解其执行流程和优化技巧。 9. **工具支持**:了解IDE中对Ibatis的支持,如插件安装和配置,以及如何利用它们提高开发效率。 通过以上知识点的学习,开发者能更好地掌握Ibatis-...
标题中的“ibatis分页”指的是在使用iBATIS(一个SQL映射框架)时,如何实现数据库查询结果的分页显示。...对于进阶学习者,深入源码分析将帮助理解iBATIS的内部工作流程,从而更好地进行定制和优化。
Ibatis框架是一个轻量级的Java持久层框架,它...通过分析源码,开发者能够深入理解Ibatis如何处理数据访问,如何与Web层交互,以及如何组织和管理数据库操作。同时,这样的分层结构也有助于代码的可维护性和扩展性。
《深入解析iBatis 2.3.0.677源码》 ...总之,通过对iBatis 2.3.0.677源码的分析,我们可以掌握其设计理念和工作原理,提升我们在Java持久层开发中的技术水平。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。
四、源码分析 iBatis的核心源码中,SqlSessionManager是整个框架的入口,负责创建SqlSession对象并管理事务。Executor接口及其实现类(SimpleExecutor、ReuseExecutor、BatchExecutor)是执行SQL的关键。在执行SQL...
通过深入学习和分析iBatis 2.3.4.726的源代码,开发者可以更好地理解其工作原理,从而优化SQL执行效率,解决框架使用中遇到的问题,提升开发效率。同时,这也为转向MyBatis的学习提供了坚实的基础。