最近开始重构公司一套手机论坛系统(为什么我不说wap论坛,是因为需要针对不同的手机浏览器,实现自动适配成wap、html以及wap2.0版本的页面)。原系统存在架构层次不清晰(表现层全jsp,直接配合数据层获取数据),访问速度慢的问题。其使用的OR映射框架是Hibernate,鉴于Hibernate的一些不满足需要情况下,我们在重构的时候换成了iBatis,为了加快访问速度,采用了iBatis的缓存技术。
iBatis的缓存配置比较简单易懂,以我使用的iBatis2.3为例,做以下配置即可实现对某些查询进行缓存:
1、在sqlMap文件中加入cacheModel的配置:
<cacheModel id="model-cache" type="MEMORY" >
<flushInterval seconds="60"/>
<flushOnExecute statement="insertProduct"/>
<flushOnExecute statement="updateProduct"/>
<flushOnExecute statement="deleteProduct"/>
<property name="size" value="1000" />
</cacheModel>
这个地方要注意的是,如果在sqlMapConfig里面设置了useStatementNamespaces="true",那么上面的flushOnExecute中的statement里面需要带上namespace,如<flushOnExecute statement="Product.insertProduct"/>,如果useStatementNamespaces="false",则可以直接按上面的写。
2、配置需要进行cache的sql statment:
<statement id="getProductList" parameterClass="int" cacheModel="model-cache">
select * from PRODUCT where PRD_CAT_ID = #value#
</statement>
配置好这两步就可实现iBatis的缓存了,下面解释一下含义:
1步中,cacheModel的id属性用于后面的statement引用,type属性标识采用何种cache方式,可选的有:
“MEMORY” (com.ibatis.db.sqlmap.cache.memory.MemoryCacheController) 。MEMORY cache 实现使用 reference 类型来管理 cache 的行为。垃圾收集器可以根据 reference类型判断是否要回收 cache 中的数据。MEMORY实现适用于没有统一的对象重用模式的应用,或内存不足的应用。
“LRU” (com.ibatis.db.sqlmap.cache.lru.LruCacheController) 。LRU Cache 实现用“近期最少使用”原则来确定如何从 Cache 中清除对象。当 Cache溢出时,最近最少使用的对象将被从 Cache 中清除。使用这种方法,如果一个特定的对象总是被使用,它将保留在 Cache 中,而且被清除的可能性最小。对于在较长的期间内,某些用户经常使用某些特定对象的情况(例如,在 PaginatedList 和常用的查询关键字结果集中翻页) ,LRU Cache 是一个不错的选择。
“FIFO” (com.ibatis.db.sqlmap.cache.fifo.FifoCacheController) 。FIFO Cache 实现用“先进先出”原则来确定如何从 Cache 中清除对象。当 Cache 溢出时,最先进入 Cache 的对象将从 Cache 中清除。对于短时间内持续引用特定的查询而后很可能不再使用的情况,FIFO Cache 是很好的选择。
“OSCACHE” (com.ibatis.db.sqlmap.cache.oscache.OSCacheController) 。OSCACHE Cache 实现是OSCache2.0缓存引擎的一个 Plugin。它具有高度的可配置性,分布式,高度的灵活性。
flushInterval 属性是配置自动更新缓存的周期,可以是hours,minutes,seconds或milliseconds。这一点我测试了一下,设置的60秒更新,通过观察日志,在60秒内,第一次查询数据库,之后iBatis会对同样的sql查询直接返回。超过60秒后的第一次查询,又会执行一次查询。这样看了,这个更新的周期可理解为第一次同样的查询可维持在cache中的时长,超过这个时长的第一次查询会触发实际的数据库操作。
flushOnExecute这是标识什么时候触发更新,statement的名字就是后面的statement的id。
statement节中设置了cacheModel,就会把这个sql跟cache关联起来。
是不是很简单呢,这里面我觉得比较关键的地方就是cacheModel的type选择,一般来说用memory就可以了,但一些特殊的应用,需要根据情况需要配置不同的更适合的cache,以进一步提高查询效率。
分享到:
相关推荐
Java ibatis缓存技术,ibatis缓存的详细解释 值得学习!
Java_ibatis缓存技术
iBATIS缓存介绍 iBATIS二级缓存 iBATIS缓存配置
iBATIS缓存的使用方法
ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园
如何解决动态数据表名,动态字段名情况下,由ibatis缓存select字段而引起的字段找不到的情况?以下是最简单的解决办法! 本文中内容真实可靠,保证用户很快掌握
ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网
ibatis 缓存配置策略,学习篇 • iBatis对查询结果集进行本地缓存。 • Cache的key由haskcode、checksum、查询参数、sqlmap Id、sql语句、调用方法名等构成。由此可以看出,不同的参数会有不同的Key。注意,他不是以...
NULL 博文链接:https://mov-webhobo.iteye.com/blog/1672240
ibatis 数据缓存,帮你了解ibatis的数据缓存机制。
iBATIS缓存介绍[借鉴].pdf
ibatis 数据缓存,讨论了ibatis 数据缓存方面的概念,即用法,用到ibatis 数据缓存的可以参考一下
NULL 博文链接:https://sunfish.iteye.com/blog/1493410
ibatis学习 ibatis总结 ibatis ibatis ibatis
ibatis技术总结,ibatis技术总结ibatis技术总结
iBatis技术框架介绍。ibatis2.x教程。
ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料ibatis资料
Spring+Ibatis技术:很好的架构文档