您的位置:首页 > 其它

关于iBatis的缓存使用

2012-09-19 09:20 295 查看
在xml配置文件中,每一个
cacheModel 元素,如下

<cacheModel id="oneday_cache" type="LRU" readOnly="false"
serialize="true">

<flushInterval hours="24"/>

<flushOnExecute statement="updateMyDate"/>

<property name="size" value="200"/>

</cacheModel>

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

2 属性serialize,如果不写,默认为false, 将它设为true,可以提高整体应用(而不仅仅是每个Session)的性能。 这种缓存为每一个Session返回缓存对象不同的实例(复本)。因此每一个Session都可以安全修改返回的对象. 注意,此时readOnly必须为false。

如果你把它设为 true ,记得检查两件事,一件事是缓存中存放的对象(你想查询的POJO)必须是可序列化的, 即实现Serializable接口。如果你有一个复杂对象属性,它也必须满足这个规则,你的整个对象树必须是可序列化的。

另一件事是关闭sql-map-config中的延迟加载属性,即lazyload=false,原因是,它使用了动态代理机制, 那个代理对象并不是Serializable的。

缓存类型的最佳适应情形:

MEMORY 没有统一的对象重用模式的应用,或内存不足的应用。

LRU 在较长的期间内,用户经常使用某些特定对象。

FIFO 用户在短时间内持续引用特定的查询,而后很可能不再使用。

根据个人实践,内存充足时使用LRU,否则使用MEMORY(WEAK)通常能获得较好的效果。

------------------

<!-- 缓存设置 -->
<!--
OSCACHE:OSCACHE Cache
实现是OSCache2.0缓存引擎的一个Plugin,它具有高度的可配置性,分布式,高度的灵活性(很推荐使用该类型)OSCache可以通过oscache.properties文件进行缓存的相关配置。
-->
<cacheModel type="OSCACHE" id="User-cache" serialize="true" readOnly="false">
<!--
readOnly为false表示外部更改cahce内容无效;readOnly=false,Serialize=ture,
所有session共享cache.
-->
<!-- Cache刷新间隔. 可以配置hours,minutes,seconds,milliseconds  -->
<flushInterval minutes="30" />
<!--
当add被执行了,那么下次的查询将会通过SQL去查,同时用查询结果更新Cache;一般add(添加),update(修改),delete(删除)操作需要配置flushOnExecute.
-->
<flushOnExecute statement="User.add" />
<flushOnExecute statement="User.updateUser" />
<flushOnExecute statement="User.update" />
<flushOnExecute statement="User.delete" />
<flushOnExecute statement="User.setAllUserOffline" />
<property name="size" value="3000" />
</cacheModel>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: