ibatiS的缓存机制用法

首先
下面说一下具体配置。
1,sqlMapConfig.xml中配置

1.1.SqlMapConfig.xml中
2.<settings
3.cacheModelsEnabled="true" //设置为true
4.enhancementEnabled="true"
5.lazyLoadingEnabled="true"
6..............
7./>
[code="java"]

2,配置具体的sqlMap.xml
[code="java"]1.<cacheModel id="baby-cache" type="LRU" readOnly="false"
2. serialize="true">
3. <flushInterval hours="24" />
4. <flushOnExecute statement="getBabyByParams" />
5. <property value="600" name="size" />
6. </cacheModel>
7.
8.
9.<select id="getBabyByParams" resultMap="baby-Result" cacheModel="baby-cache">
10. select * from Baby
11. <dynamic prepend="where">
12. <isPropertyAvailable property="name" prepend="and">
13. name = #name#
14. </isPropertyAvailable>
15. <isPropertyAvailable property="sex" prepend="and">
16. sex =
17. #sex,jdbcType=VARCHAR,javaType=com.yajun.enumdemo.SexEnum#
18. </isPropertyAvailable>
19. <isPropertyAvailable property="BirthdayBondStart"
20. prepend="and">
21. <![CDATA[
22. birthday >= cast(#BirthdayBondStart# as datetime)
23. ]]>
24. </isPropertyAvailable>
25. <isPropertyAvailable property="BirthdayBondEnd"
26. prepend="and">
27. <![CDATA[
28. birthday <= cast(#BirthdayBondEnd# as datetime)
29. ]]>
30. </isPropertyAvailable>
31. <isPropertyAvailable property="hobby" prepend="and">
32. hobby like '%'||#hobby#||'%'
33. </isPropertyAvailable>
34. </dynamic>
35. </select>


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类 implements com.ibatis.sqlmap.engine.cache.CacheController.

readOnly : 是否只读. 默认为true, 只读.
所谓只读,只是说建议您在开发的时候,对于配置为只读的缓存,不要进行更新操作,这样可能会出现问题,比如可能会出现同步的问题,因为当您访问只读缓存的时候,框架直接将缓存中对象的引用返回给你,如果多个线程试图对其修改,就有可能出现同步问题。

可读写缓存与只读缓存的区别是,当你访问缓存中的数据时,缓存会返回给你一个原数据的副本,而不是直接将原数据的引用返回给你。这样即使是多线程,由于各自用于一个完全一样的副本,也不回出现线程同步的问题。可读写缓存配置时需要使用:readOnly="false"


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: <property name="cache-size" value="100" />
MEMORY: <property name="reference-type" value="WEAK" />

另外, ibatis 的缓存机制使用必须特别谨慎。特别是flushOnExecute 的设定,需要考虑到所有可能引起实际数据与缓存数据不符的操作。如本模块中其他Statement对数据的更新,其他模块对数据的更新,甚至第三方系统对数据的更新。否则,脏数据的出现将为系统的正常运行造成极大隐患。
如果你不能确定,或者数据库同时由其它系统共用,你不能完全控制数据何时被更新,就不能使用Ibatis提供的缓存机制,否则就会出现查询出不是最新数据的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值