iBATIS SQL Maps之缓存Mapped Statement结果集。

通过在查询Statement中指定cacheModel属性,可以缓存Mapped Statement中得到的查询结果。Cache model是在SQL Map XML文件中定义的可配置缓存模式,可以使用cacheModel元素来配置。例子如下:

<cacheModel id ="product-cache" type = "LRU" readOnly = "true" serialize = "false" >

<flushInterval hours = "24" />

<flushOnExecute statement = "insertProduct" /> 

<flushOnExecute statement = "updateProduct" /> 

<flushOnExecute statement = "deleteProduct" /> 

<property name = "cache-size" value = "1000" />

</cacheModel>

上面的cache model创建了一个名为“product-cache”的缓存,使用“近期最少使用”(LRU)实现。Implemention属性的名称要么是全限定的类名,要么是缓存实现的别名。根据cacheModel中flush元素的内容,上面的例子每24小时刷新一次。一个cacheModel只能有一个flushInterval元素,他可以使用hours,minutes,seconds或milliseconds来设定。另外,当insertProduct,updateProduct或deleteProduct的Mapped Statement执行时,缓存也被刷新。cacheModel可以定义任意多的flushOnExecute元素。某些cache model的实现可能需要另外的属性,如上面的“cache-size”属性。在LRU cache model中,cache-size指定了缓存储存的项数。一旦配置了cache model,您可以指定mapped statement使用的cache model,例如:

<statement id = "getProductList" cacheModel = "product-cache" >

select * from PRODUCT where PRD_CAT_ID = #value#

</statement>

  • 只读VS可读写(readOnly)

框架同时支持只读和可读写缓存。只读缓存可供所有用户共享,因此性能更好。但是,只读缓存的数据不应该被修改。相反,要更新数据,必须从数据库(或读写缓存)中读出数据。因此,如果要读出数据并修改,则需要可读写缓存。要使用只读缓存,在cacheModel设置readOnly = "true"。要使用可读写缓存。则设置readOnly = "false"。缺省为只读缓存(true)。

  • Serializable可读写缓存(serialize )

正如您所知道的,只对当前Session有效的缓存对整体应用性能的提高作用有限。Serializable可读写可以提高整体应用(而不仅仅是每个Session)的性能。这种缓存为每一个Session返回缓存对象不同的实例(复本)。因此每一个Session都可以安全修改返回的对象。不同之处在于,通常您希望从缓存中得到同一个对象,但这种情况下得到的是不同的对象。还有,每一个缓冲在Serializable缓存的对象都必须是Serializable的。这意味着不能同时使用Serializable缓存和延迟加载,因为延迟加载代理不是Serializable的。想知道如何把Serializable缓存,延迟加载和联合查询结合起来使用,最好的方法是尝试。要使用Serializable缓存,设置readOnly="false"和serialize = "true"。缺省情况下,缓存是只读模式,不使用Serializable缓存。只读缓存不需要Serializable。

  • 缓存类型(type)

Cache Model使用插件方式支持不同的缓存算法。它的实现在cacheModel的用type属性来指定(如上所示)。指定的实现类必须实现CacheController接口,或是下面4个别名中的其中之一。Cache Model实现的其他配置参数通过cache的property元素来设置。
目前包括以下的4个实现。
    • “MEMORY”(com.ibatis.bd.sqlmap.cache.memory.MemoryCacheController)

MEMORY cache实现使用reference类型来管理cache的行为。垃圾收集器可以根据reference类型判断是否要回收cache中的数据。
MEMORY实现适用于没有统一的对象重用模式的应用,或内存不足的应用。
<cacheModel id = "product-cache" type = "MEMORY">
<flushInterval hours = "24" />
<flushOnExecute statement = "insertProduct" />
<flushOnExecute statement = "updateProduct" />
<flushOnExecute statement = "deleteProduct" />
<property name = "reference" value = "WEAK" />
</cacheModel>
MEMORY cache实现只认识一个<property>元素。这个名为“reference-type”属性的值必须是STRONG、SOFT和WEAK三者其一。这三个值分别对应于JVM不同的内存 reference类型。
下面的表格介绍了在MEMORY实现中不同的reference类型。要更好地理解reference类型,请参考JDK文档中的java.lang.ref,以获得更多关于“reachability”的信息。
    • “LRU”(com.ibatis.db.sqlmap.cache.lru.LruCacheController)
LRU Cache实现用“近期最少使用”原则来确定如何从Cache中清除对象。当Cache溢出时,最近最少使用的对象将被从Cache中清除。使用这种方法,如果一个特定的对象总是被使用,它将保留在Cache中,而且被清除的可能性最小。
对在较长的期间内,某些用户经常使用某些特定对象的情况(例如,在PaginatedList和常用的查询关键字结果集中翻页),LRU Cache是一个不错的选择。
LRU Cache实现可以这样配置:
<cacheModel id = "product-cache" type = "LRU">
<flushInterval hours = "24" />
<flushOnExecute statement = "insertProduct" />
<flushOnExecute statement = "updateProduct" />
<flushOnExecute statement = "deleteProduct" />
<property name = "size" value = "1000" />
</cacheModel>
LRU Cache实现只认可一个property元素。其名为“cache-size”的属性值必须是整数,代表同时保存在Cache中对象的最大数目。值得注意的是,这里指的对象可以是 任意的,从单一的String对象到JavaBean的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 = "insertProduct" />
<flushOnExecute statement = "updateProduct" />
<flushOnExecute statement = "deleteProduct" />
<property name = "size" value = "1000" />
</cacheModel>
FIFO Cache实现只认可一个property元素。其名为“cache-size”的属性值必须是整数,代表同时保存在Cache中对象的最大数目。值得注意的是,这里指的对象可以是
任意的,从单一的String对象到JavaBean的ArrayList对象都可以。因此,不要Cache太多的对象,以免内存不足。
    • “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的大小,持久化方法(内存,文件等)和集群方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值