Ibatis缓存的使用:cachemodel

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" />


readonly和serialize的组合会影响到应用程序的性能:

readonly serialize 结果 
true false 好 
false true 好 
false false 警告 
true true 差 



3.使用示例

在statment的使用上,直接加一个cacheModel属性指向id即可。

  1. <select id="getAllUser" resultClass="user" cacheModel="userCache">  
  2. select * from user;  
  3. </select>  

第一次查询会走sql,之后的查询会走缓存

控制台输出


说明查询的是缓存


参考地址:https://blog.csdn.net/findmyself_for_world/article/details/49976107

猜你喜欢

转载自blog.csdn.net/hiqingtian/article/details/79994152
今日推荐