补充关于iBatis的缓存使用

  在你的xml配置文件中,每一个 cacheModel 元素,如下
  <cacheModel id="oneday_cache" type="LRU" readOnly="true" serialize="false">
      <flushInterval hours="24"/>
      <flushOnExecute statement="updateMyDate"/>
      <property name="size" value="200"/>
   </cacheModel> 
 1 属性readOnly如果不写,默认是true,这时的缓存效果无疑最好,请注意这里的只读并不是说数据库里的数据不能增删改,而是指client从缓存池中取得对象后,不会修改其属性状态,因为并发用户得到的是同一个缓存对象。通常这么作是比较合适的,你调用dao的query方法得到的对象只用来显示,如果修改,通常会创新一个新的vo(值对象),接收formBean(or dto)的属性,然后再update,这样并不会“改动”缓存池中取出的这个原始对象,当增删改操作后,缓存的flush方法已被调用,可以保证数据库和缓存中数据对象的一致性。记住,缓存使用的前提:保证你对数据库的写操作是“封闭”的,即均通过iBatis来进行,不要有哪个地方直接调用了jdbc来update你需要缓存的数据表。
 2 属性serialize,如果不写,默认为false, 将它设为true,可以提高整体应用(而不仅仅是每个Session)的性能。 这种缓存为每一个Session返回缓存对象不同的实例(复本)。因此每一个Session都可以安全修改返回的对象.   注意,此时readOnly必须为false。
     如果你把它设为 true ,记得检查两件事,一件事是缓存中存放的对象(你想查询的POJO)必须是可序列化的, 即实现Serializable接口。如果你有一个复杂对象属性,它也必须满足这个规则,你的整个对象树必须是可序列化的。
     另一件事是关闭sql-map-config中的延迟加载属性,即lazyload=false,原因是,它使用了动态代理机制, 那个代理对象并不是Serializable的。
     通常情况下该属性使用默认值false.
   缓存类型的最佳适应情形:


   MEMORY    没有统一的对象重用模式的应用,或内存不足的应用。
   LRU       在较长的期间内,用户经常使用某些特定对象。
   FIFO      用户在短时间内持续引用特定的查询,而后很可能不再使用。
  
   根据个人实践,内存充足时使用LRU,否则使用MEMORY(WEAK)通常能获得较好的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值