概述
- iBatis对查询结果集进行本地缓存。
- Cache的key由haskcode、checksum、查询参数、sqlmap Id、sql语句、调用方法名等构成。由此可以看出,不同的参数会有不同的Key。注意,他不是以查询参数的Class的hashcode或toString方法作为key的一部分,而是以在sqlmap使用的变量的集合。
- queryForObject和queryForList都可以缓存。其它片断不支持。
- 可以设定为定时刷新或受条件触发刷新Key。如:在执行Update的时候,可以刷新Cache。
刷新Cache时,无法手动控制刷新单条记录。只能刷新该Cache ID的全部Cache。
- 目前有4种Cache实现,但是无法自定义扩展Cache。
- Cache的数量可以指定。
- Cache的put和get方法内有同步,外部无。所以同一参数同时查询时,Cache是不能命中的。在有一个结果put到Cache后,后续查询才能命中。
相关示例代码如下:
<cacheModel id="lruCache" type="LRU" serialize="true" readOnly="false">
<property name="reference-type" value="WEAK"/>
<flushOnExecute statement="insertAccount"/>
<flushOnExecute statement="updateAccount"/>
<flushOnExecute statement="deleteAccountById"/>
</cacheModel>
<select id="selectAccountById" parameterClass="int" resultClass="Account" cacheModel="lruCache">
select ACC_ID as id, ACC_FIRST_NAME as firstName,
ACC_LAST_NAME as lastName, ACC_EMAIL as emailAddress from ACCOUNT where ACC_ID = #id#
</select>
<update id="updateAccount" parameterClass="Account">
update ACCOUNT set ACC_FIRST_NAME=#firstName# , ACC_LAST_NAME = #lastName# , ACC_EMAIL =#emailAddress# where ACC_ID = #id#
</update>
Cache规则
- Type 目前有4种实现。建议用LRU或者OsCache
- readOnly,表示Cache对象是否只读。False,表示外部更改cache内容无效。
- Serialize,是否序列化。true,表示存贮到cache中的是系列化后的对象。
- 组合:
- readOnly=false, Serialize=false:Cache Session有效。如:1+n时,下次1+n将会失效。 不系列化,外部更改有效。
- readOnly=true, Serialize=false:所有session共享Cache,取出时实例是同一个。不系列化,外部更改有效。默认的
- readOnly=false, Serialize=true:所有session共享Cache,取出时实例不一样,但是内容一样。 系列化,外部更改无效
- readOnly=true, Serialize=true: 同默认效果一样。
- 看得出,主要是通过系列化来保证外部更改属性后不影响其它session的取出的结果。
4种Cache实现
- LRU,最后使用的排到前面。Cache溢出时,最远被使用的就被clear。
- FIFO,先进先出。
- Memory,内存引用。该实现无数量限制。前两种是基于jvm实现。
- WEAK,产生内存回收动作时,失效。
- SOFT,内存不足时,失效。
- STRONG,显式刷新时,失效。
- OsCache(支持分布式)。通过oscahce.properties控制。
适应范围
- 频繁查询,很少更改的内容。如:分类等。
- 1+n查询。n是父类,数据量较少。如:查询Spu信息时,同意需要获得其品类信息。
- 效率低,执行频率高的SQL。如统计一类的SQL。
- 有了Cache机制后,1+n不再可怕。
原创文章,需要转载需经本人同意!
分享到:
相关推荐
本篇将深入探讨iBatis缓存技术,旨在帮助你理解并掌握如何在实际项目中有效应用iBatis缓存。 首先,我们要了解iBatis的缓存分为一级缓存和二级缓存。一级缓存是SqlSession级别的,也称为本地缓存,它存储在...
源码中`org.apache.ibatis.cache.Cache`接口定义了缓存的基本操作,而具体的缓存实现如`org.apache.ibatis.cache.impl.PerpetualCache`则实现了缓存的存储和读取。 通过阅读和理解iBatis的源码,我们可以更深入地...
此外,iBATIS还提供了一些辅助工具,如`ParameterMap`用于管理SQL语句的输入参数,`ResultMap`用于处理查询结果的映射,以及`Cache`机制,用于缓存查询结果,提高系统性能。这些工具类使得开发者能够更方便地进行...
在深入理解iBatis的Cache概念之前,首先需要知道iBatis是一个轻量级的持久层框架,它将SQL映射与Java代码分离,提供了更灵活的数据库操作方式。 **Cache概述** iBatis 提供了本地数据缓存功能,用于存储查询结果集...
《深入解析iBatis 3.0:基于mybatis-jpetstore-6.0.1示例》 iBatis,又称MyBatis,是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。iBatis 3.0版本(也称为MyBatis 3.0)引入了许多新特性,极大地...
通过查阅这个CHM文件,开发者可以深入理解iBATIS的使用方式,学习如何有效地将SQL语句和Java代码结合起来,从而提升数据库操作的效率和代码的可维护性。此外,对于那些需要升级到更高版本或者从其他框架迁移至iBATIS...
8. **源码分析**:深入Ibatis源码,理解其执行流程和优化技巧。 9. **工具支持**:了解IDE中对Ibatis的支持,如插件安装和配置,以及如何利用它们提高开发效率。 通过以上知识点的学习,开发者能更好地掌握Ibatis-...
通过这个示例,你可以深入理解iBATIS缓存的工作原理,以及如何在项目中有效利用缓存优化性能。对于源码的阅读,可以更直观地了解iBATIS如何实现缓存的存储和检索,这对于调试和优化系统性能非常有帮助。同时,工具的...
- ****:设置ibatis运行时的行为参数,如最大请求数(`maxRequests`)、最大会话数(`maxSession`)、最大事务数(`maxTransaction`)以及语句缓存大小(`statementCacheSize`)等。 ##### 2. Statement元素 - **id**:唯一...
默认情况下,Ibatis提供了本地缓存(Local Cache)和二级缓存(Second Level Cache)。本地缓存存储了单个SqlSession内的查询结果,而二级缓存则是在整个SqlSessionFactory级别共享的,可跨SqlSession重用查询结果,...
对于源码爱好者来说,研究iBATIS的缓存实现可以深入理解其内部的工作原理。iBATIS的缓存实现主要依赖于Java的Map接口,通过自定义的缓存实现类(如DefaultCache)进行管理。在处理并发访问时,iBATIS可能会使用到...
以下是对iBatis缓存配置策略的深入解析: 首先,iBatis 的 Cache 键(key)是由多个因素组成的,包括对象的hashCode、checksum、查询参数、sqlmap ID、SQL语句以及调用方法名。由于这些因素的多样性,即使是微小的...
《IBatis2开发指南》是一份详尽的文档,旨在指导开发者如何利用IBatis框架进行高效的数据访问层开发。...通过深入理解IBatis的核心概念和高级特性,开发者可以充分利用其优势,构建出高性能、可扩展的应用程序。
iBatis是一款流行的数据库持久层框架,它的主要特点是提供了一种半自动化的对象关系...无论是对于初学者还是有经验的开发者,通过本指南深入学习iBatis,都能够更加高效地利用这个框架来开发稳定和高性能的数据库应用。
iBATIS 是一款著名的开源...通过深入阅读iBATIS的API文档,开发者能够更好地理解如何利用这些组件和机制,实现高效、灵活的数据库操作。同时,文档中的示例代码和说明可以帮助解决实际开发中遇到的问题,提高开发效率。
### ibatis2.0开发指南知识点详解 #### 一、ibatis简介 ibatis是一款流行的开源框架,...通过对ibatis的基础配置和高级特性的深入理解,开发人员可以更好地利用这一框架来提高应用程序的数据访问层的性能和可维护性。
- "ibatis_cache.doc":这份文档可能详细讲解了Ibatis的缓存机制,包括本地缓存和二级缓存的配置、工作原理以及如何优化。 - "ibatis 开发指南.pdf":这份指南可能是Ibatis的官方开发手册,涵盖了从安装、配置到实际...