cachemodel是ibatis里面自带的缓存机制:
1:配置开始使用缓存
在使用ibatis的时候,我们可以开启他自带的缓存,在实际使用中,在sqlmap-config.xml 中一直有设置
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
maxRequests="512"
maxSessions="64"
maxTransactions="50"
useStatementNamespaces="true"
/>
在我们设置 cacheModelsEnabled="true" 的时候,就是指我们启用了 mapping文件(****sqlMap.xml)的缓存,
然后,我们就可以 在xml(eg:ebooksqlMap.xml)中设置<cacheModel></cacheModel>了
2:在dao层的xml中配置:缓存模块
<cacheModel type="LRU" id="userCache" readOnly="true" serialize="false">
<flushInterval hours="24"/>
<flushOnExecute statement="insertVclass"/>
<flushOnExecute statement="batchInsertVclass"/>
<flushOnExecute statement="removeVclass"/>
<property name="cache_size" value="50"/>
</cacheModel>
对cachemodel中一些用法进行解释一下:
type:是缓存的类型,ibatis中有4种方式,分别为MEMORY、LRU、FIFO、OSCACHE
MEMORY是内存缓存,和Java内存管理机制类似分为[SOFT、WEAK、STRONG] LRU是使用最近最少使用策略 FIFO是使用先进先出策略 OSCACHE是通过第三方的缓存插件实现
MEMORY是内存缓存,和Java内存管理机制类似分为[SOFT、WEAK、STRONG] LRU是使用最近最少使用策略 FIFO是使用先进先出策略 OSCACHE是通过第三方的缓存插件实现
readOnly:是否只读. 默认为true, 只读。
Serialize:是否从Cache中读取同一个对象,还是对象的副本。只有在readOnly=false才有效.
因为Cache是只读的,那么为不同session返回的对象肯定是一个.
只有在Cache是可读写的时候,才需要为每个session返回对象的副本.
这种缓存为每一个Session返回缓存对象不同的实例(复本)。因此每一个Session都可以安全修改返回的对象. 注意,此时readOnly必须为false。如果你把它设为 true ,记得检查两件事,一件事是缓存中存放的对象(你想查询的POJO)必须是可序列化的,即实现Serializable接口。如果你有一个复杂对象属性,它也必须满足这个规则,你的整个对象树必须是可序列化的。另一件事是关闭sql-map-config中的延迟加载属性,即lazyload=false,原因是,它使用了动态代理机制,那个代理对象并不是Serializable的。
flushInterval:Cache刷新间隔. 可以配置hours,minutes,seconds,milliseconds.
注:不是说间隔时间到了,在cache的statement会自己刷新,而是说,见间隔时间过了后,在下次的查询的时候,江不会是直接去cache中拿值,而会用sql去取值,也就是: 如果,间隔时间过了,还没有Cache对应的statement执行的话,那么Cache中就会一直是旧的,不用担心Cache数据是旧的,因为下次的查询将会直接从SQL查询,而非Cache,查询的结果也会去更新Cache的值。
一个 cacheModel 只能有一个 flushInteval 元素
flushOnExecute :当这些statement被执行了,那么下次的查询将会通过SQL去查,同时用查询结果更新Cache.
注: 和flushInterval的刷新一样,不是主动刷新,而是由下次查询来触发被动刷新。
在一个cacheModel中可以指定多个flushOnExecute。
statement:就是需要被执行的statement的id
cacheModel可以定义任意多的flushOnExecute元素
property:这是针对cacheModel的额外的一些属性配置.不同type的cacheModel将会有自己专有的一些property配置.
在 LRU cache model 中,cache-size指定了缓存储存的项数
FIFO: <property name="size" value="100" />
LRU: <property name="cache-size" value="100" />
MEMORY: <property name="reference-type" value="WEAK" />
3.使用示例
在statment的使用上,直接加一个cacheModel属性指向id即可。
- <select id="getAllUser" resultClass="user" cacheModel="userCache">
- select * from user;
- </select>
第一次查询会走sql,之后的查询会走缓存
控制台输出
说明查询的是缓存
参考地址:https://blog.csdn.net/findmyself_for_world/article/details/49976107