`
xiangxingchina
  • 浏览: 507865 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

IBatis的缓存

阅读更多

在xml配置文件中,每一个 cacheModel 元素,如下
<cacheModel id="oneday_cache" type="LRU" readOnly="false" serialize="true">
      <flushInterval hours="24"/>
      <flushOnExecute statement="updateMyDate"/>
      <property name="size" value="200"/>
</cacheModel>

一个 cacheModel 只能有一个 flushInteval 元素,它可以使用 hours,minutes,seconds或 milliseconds 来设定。

type(缓存类型):
"MEMORY" (com.ibatis.db.sqlmap.cache.memory.MemoryCacheController)
MEMORY cache 实现使用 reference 类型来管理 cache 的行为。垃圾收集器可以根据 reference类型判断是否要回收 cache 中的数据。MEMORY实现适用于没有统一的对象重用模式的应用,或内存不足的应用。

MEMORY实现可以这样配置:
<cacheModel id="product-cache" type="MEMORY">
      <flushInterval hours="24"/>
      <flushOnExecute statement="updateMyDate"/>
      <property name="reference-type" value="WEAK"/>
</cacheModel>
// MEMORY cache 实现只认识一个<property>元素。这个名为“reference-type”属性的值必须是 STRONG,SOFT 和 WEAK 三者其一。这三个值分别对应于 JVM 不同的内存 reference类型。

"LRU" (com.ibatis.db.sqlmapache.lru.LruCacheController)
LRU Cache 实现用“近期最少使用”原则来确定如何从 Cache 中清除对象。当 Cache 溢出时,最近最少使用的对象将被从 Cache 中清除。使用这种方法,如果一个特定的对象总是被使用,它将保留在 Cache 中,而且被清除的可能性最小。对于在较长的期间内,某些用户经常使用某些特定对象的情况(例如,在PaginatedList 和常用的查询关键字结果集中翻页),LRU Cache 是一个不错的选择。

LRU Cache实现可以这样配置:
<cacheModel id="product-cache" type="LRU">
      <flushInterval hours="24"/>
      <flushOnExecute statement="updateMyDate"/>
      <property name="size" value="1000"/>
</cacheModel>
// LRU Cache实现只认可一个 property元素。其名为“cache-size”的属性值必须是整数,代表同时保存在 Cache中对象的最大数目。值得注意的是,这里指的对象可以是任意的,从单一的 String 对象到 Java Bean 的 ArrayList 对象都可以。因此,不要 Cache太多的对象,以免内存不足。

"FIFO" (com.ibatis.db.sqlmap.cache.fifo.FifoCacheController)
FIFO Cache 实现用“先进先出”原则来确定如何从 Cache 中清除对象。当 Cache 溢出时,最先进入 Cache 的对象将从 Cache 中清除。对于短时间内持续引用特定的查询而后很可能不再使用的情况,FIFO Cache 是很好的选择。

FIFO Cache可以这样配置:
<cacheModel id="product-cache" type="FIFO">
      <flushInterval hours="24"/>
      <flushOnExecute statement="updateMyDate"/>
      <property name="size" value="1000"/>
</cacheModel>
// property 的 size 同LRU

"OSCACHE" (com.ibatis.db.sqlmap.cache.oscache.OSCacheController)
OSCACHE Cache 实现是OSCache2.0缓存引擎的一个 Plugin。它具有高度的可配置性,
分布式,高度的灵活性。

OSCACHE 实现可以这样配置:
<cacheModel id="product-cache" type="OSCACHE">
<flushInterval hours="24"/>
<flushOnExecute statement="insertProduct"/>
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
</cacheModel>

// OSCACHE 实现不使用 property 元素,而是在类路径的根路径中使用标准的oscache.properties 文件进行配置。在 oscache.properties文件中,您可以配置 Cache 的算法(和上面讨论的算法很类似),Cache 的大小,持久化方法(内存,文件等)和集群方法。

readOnly: 默认是true,这时的缓存效果无疑最好,因为系统不需要考虑更新操作引起缓存与实际数据不一致的问题,只读缓存的例子是固化到数据库中的一些配置参数表。但是通常我们想缓存的数据是需要增删改的,这时务必记得要加上readOnly = "false";

serialize: 默 认为false。将它设为true,可以提高整体应用(而不仅仅是每个Session)的性能。这种缓存为每一个Session返回缓存对象不同的实例 (复本)。因此每一个Session都可以安全修改返回的对象。 注意此时readOnly必须为false。如果你把它设为 true ,记得检查两件事:
        一件事是缓存中存放的对象(你想查询的POJO)必须是可序列化的, 即实现Serializable接口。如果你有一个复杂对象属性,它也必须满足这个规则,你的整个对象树必须是可序列化的。
        另一件事是关闭sql-map-config中的延迟加载属性,即lazyload=false。原因是它使用了动态代理机制, 那个代理对象并不是Serializable的。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics