zjyzz 2010-11-17
为什么要缓存:一句话,减少服务器处理次数,加快访问速度
Ibatis的缓存代码
使用ibatis缓存的方法:
在对应每个表的xml中加入一个cacheModel模块,例如:
<cacheModel id="user-cache" type="LRU" readOnly="false"serialize="true"> <flushInterval hours="24" /> <flushOnExecute statement="getUser" /> <property value="600" name="size" /> </cacheModel>
id :cacheModel的id.。type :cache的类型.。
ibatis目前提供了LRU,MEMORY,FIFO,OSCACHE这四种.
FIFO:com.ibatis.sqlmap.engine.cache.fifo.FifoCacheController
LRU:com.ibatis.sqlmap.engine.cache.fifo.LruCacheController
MEMORY:com.ibatis.sqlmap.engine.cache.fifo.MemoryCacheController
OSCACHE:com.ibatis.sqlmap.engine.cache.fifo.OSCacheController
当然,你也可以自己来实现Cache,你需要做的是让你的Cache类implementscom.ibatis.sqlmap.engine.cache.CacheController.
readOnly:是否只读.默认为true,只读。
Serialize:是否从Cache中读取同一个对象,还是对象的副本。只有在readOnly=false才有效.
因为Cache是只读的,那么为不同session返回的对象肯定是一个.
只有在Cache是可读写的时候,才需要为每个session返回对象的副本.flushInterval:Cache刷新间隔.可以配置hours,minutes,seconds,milliseconds.
注:不是说,间隔时间到了,在Cache的statement会自己刷新,而是说,在间隔时间过了后,下次的查询
将不会从Cache中直接去值,而会用SQL去查.也就是:如果,间隔时间过了,还没有Cache对应的statement执行
的话,那么Cache中就会一直是旧的,不用担心Cache数据是旧的,因为下次的查询将会直接从SQL查询,而非Cache,查询的结果也会去更新Cache的值.
flushOnExecute:当这些statement被执行了,那么下次的查询将会通过SQL去查,同时用查询结果更新Cache.
注:和flushInterval的刷新一样,不是主动刷新,而是由下次查询来触发被动刷新。
在一个cacheModel中可以指定多个flushOnExecute。property:这是针对cacheModel的额外的一些属性配置.不同type的cacheModel将会有自己专有的一些property配置.
FIFO: <property name="size" value="100" />
LRU:<propertyname="cache-size"value="100"/>
MEMORY: <property name="reference-type" value="WEAK" />
在statment的使用上,直接加一个cacheModel属性指向id即可。
<select id="getAllUser" resultClass="user" cacheModel="user-cache"> select * from user; </select>
1.LRU型Cache
当Cache达到预先设定的最大容量时,ibatis会按照“最少使用”原则将使用频率最少的对象从缓冲中清除。
2.在生产部署时,建议采用OSCache,OSCache 是得到了广泛使用的开源Cache 实现(Hibernate 中也提供了对OSCache 的支持),它基于更加可靠高效的设计,更重要的是,最新版本的OSCache 已经支持Cache 集群。如果系统需要部署在集群中,或者需要部署在多机负载均衡模式的环境中以获得性能上的优势,那么OSCache在这里则是不二之选。<cacheModelid="userCache"type="OSCACHE">
<flushIntervalhours="24"/>
<flushOnExecutestatement="updateUser"/>
<propertyname="size"value="1000"/>
</cacheModel>
之所以配置简单,原因在于,OSCache拥有自己的配置文件(oscache.properties)J。配置好之后,将此文件放在CLASSPATH 中,OSCache 在初始化时会自动找到此文件并根据其中的配置创建缓存实例。如:对于sql语句order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id"。