一、概述
· 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后,后续查询才能命中。
1、配置使用cache
<settings cacheModelsEnabled="true" useStatementNamespaces="true" /> |
2、配置cacheModel
<cacheModel type="LRU" id="wll-cache" readOnly="true" serialize="false"> <property name="reference-type" value="WEAK"/> // flushOnExecute:设置执行哪些操作时更新缓存 <flushOnExecute statement="STAFF_MAP.deleteByPrimaryKey"/> <flushOnExecute statement="STAFF_MAP.updateByPrimaryKey"/> <flushOnExecute statement="STAFF_MAP.insert"/> </cacheModel> |
3、设置指定的select方法配置cache
<select id="selectListSelective" resultMap="StaffResultRow"parameterClass="staff" cacheModel="wll-cache"> select * from from STAFF </select> |
二、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体现
1、LRU,最后使用的排到前面。
LRU Cache 实现用“近期最少使用”原则来确定如何从 Cache 中清除对象。当 Cache溢出时,最近最少使用的对象将被从 Cache 中清除。使用这种方法,如果一个特定的对象总是被使用,它将保留在 Cache中,而且被清除的可能性最小。对于在较长的期间内,某些用户经常使用某些特定对象的情况(例如,在PaginatedList 和常用的查询关键字结果集中翻页) ,LRU Cache 是一个不错的选择。
2、FIFO,先进先出。
FIFO Cache 实现用“先进先出”原则来确定如何从 Cache 中清除对象。当 Cache 溢出时,最先进入Cache 的对象将从 Cache 中清除。对于短时间内持续引用特定的查询而后很可能不再使用的情况,FIFO Cache 是很好的选择。
3、Memory,内存引用。
MEMORY cache 实现使用 reference 类型来管理 cache 的行为。垃圾收集器可以根据 reference类型判断是否要回收 cache 中的数据。MEMORY实现适用于没有统一的对象重用模式的应用,或内存不足的应用。
4、OsCache(支持分布式)。通过oscahce.properties控制。
OSCACHE Cache 实现是OSCache2.0缓存引擎的一个 Plugin。它具有高度的可配置性,分布式,高度的灵活性。
四、适用范围
- 频繁查询,很少更改的内容。如:分类等。
- 1+n查询。n是父类,数据量较少。如:查询Spu信息时,同意需要获得其品类信息。
- 效率低,执行频率高的SQL。如统计一类的SQL。
- 有了Cache机制后,1+n不再可怕。