一 什么是缓存以及为什么要使用缓存
从数据库读出数据后,该数据在某个缓冲区暂时被保存起来。当我们再次需要读取该数据的时候,直接从该缓冲区中读取,而不用再次访问数据库。我们知道数据库连接是很昂贵的资源,减少对数据库的访问是提高性能的手段之一。
二 ibatis中使用缓存的配置方法
①sqlmapconfig.xml
<sqlmapconfig>
<settings cachemodelsenabled="true" />
......
</sqlmapconfig>
②studentmapper.xml
<sqlmap namespace="student">
<typealias alias="student" type="cn.xy.student" />
<!-- 配置缓存模型 -->
<cachemodel id="stu-cache" type="oscache" readonly="true"
serialize="true">
<flushinterval hours="24" />
<flushonexecute statement="insertstu" />
<flushonexecute statement="updatestu" />
<flushonexecute statement="deletestu" />
<property value="500" name="size" />
</cachemodel>
<resultmap id="studentmap" class="student">
<result property="id" column="id" />
<result property="name" column="name" />
</resultmap>
<select id="selectalluser" resultmap="studentmap" cachemodel="stu-cache">
select * from student
</select>
<insert id="insertstu" parameterclass="student">
insert into student(id,name) values (#id#, #name#)
</insert>
.......
</sqlmap>
③ java代码使用ibatis就不赘述了
三 缓存标签详解
1 id 一个标识,在下面的select语句中将引用该标识。
2 type cachemodel的实现类型,目前有如下4种实现:
①memory(com.ibatis.sqlmap.engine.cache.memory.memorycachecontroller)
memory cache实现使用java的软引用类型来管理cache的行为,使用一个hashmap来保存当前需要缓存的数据对象的引用,当内存不足时java虚拟机将回收这些引用,从而清除cache。
②lru(com.ibatis.sqlmap.engine.cache.lru.lrucachecontroller)
lru cache 实现用“近期最少使用”原则来确定如何从cache中清除对象,当cache溢出时,最近最少使用的对象将被从cache中清除。
③fifo(com.ibatis.sqlmap.engine.cache.fifo.fifocachecontroller)
fifo cache实现用先进先出原则来确定如何从 cache 中清除对象。即最先进入cache的对象将从cache中清除。
④oscache(com.ibatis.sqlmap.engine.cache.oscache.oscachecontroller)
oscache cache实现是oscache2.0缓存引擎的一个plugin,它具有高度的可配置性,分布式,高度的灵活性(很推荐使用该类型)oscache可以通过oscache.properties文件进行缓存的相关配置。
3 readonly readonly的值表示缓存中的数据对象是否只读。若为true,则当数据对象发生变化时,数据对象就将被从缓存中废除,下次需要重新从数据库读取数据,构造新的数据对象。而若为false,则意味着缓存中的数据对象可更新,不必从数据库中读取。
4 serialize 如果需要全局的数据缓存,cachemodel的serialize属性必须被设为true。否则数据缓存只对当前session有效,局部缓存对系统的整体性能提升有限。在serialize="true"的情况下,如果有多个session同时从cache 中读取某个数据对象,cache将为每个session返回一个对象的复本,也就是说,每个session将得到包含相同信息的不同对象实例。因而session可以对其从cache获得的数据进行存取而无需担心多线程并发情况下的同步冲突。
5 <flushinterval hours="24">
指定多长时间清除缓存,例如指定每24小时强行清空缓存区的所有内容。
6 <flushonexecute statement="insertstu"/>在执行指定的语句时将刷新数据库。
7 size
指定cache的最大容量。