与大多数持久层框架一样,MyBatis也提供了缓存机制,通过缓存机制可以减少对数据库的访问,提高查询效率。mybatis的一级缓存是SqlSession级别的它是默认打开的,二级缓存为SQLSessionFactory级别的默认关闭。下面介绍二级缓存如何开启和配置。
二级缓存的开启
1、首先在mybatis配置文件的节点中配置整体开启二级缓存。
<settings>
<!-- 开启日志 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 开启二级缓存(整体开启) -->
<setting name="cacheEnabled" value="true"/>
</settings>
2、然后为具体的Mapper映射文件的命名空间进行二级缓存的具体配置。
<!-- cacahe节点:配置当前命名空间下mapper的缓存 -->
<cache eviction= "LRU" flushInterval= "100000" readOnly= "true" size= "1024"/>
2.1、其中eviction代表缓存回收策略,目前mybatis提供以下回收策略:
LRU(Least Recently Used):最近最少使用的,回收最长时间不用的对象;
FIFO(First in first out):先进先出,按照对象进入缓存的顺序来移除;
SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象;
WEAK:弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象。
2.2、flushInterval:缓存刷新时间间隔,单位为毫秒,每经过相应时间会对缓存进行刷新,如果没有配置,当SQL被执行的时候才会刷新缓存。
2.3 、readOnly:只读,设置只读为“true”意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是没有办法修改缓存,它的默认值是false,不允许修改。
2.4、size:引用数目,是一个整数,代表缓存最多可以存储多少的对象,该数据不宜设置过大,如果设置过大会导致内存溢出。
3、使缓存对象的实体类实现序列化接口(Serializable),使其能够被序列化和反序列化。
由于二级缓存的数据不一定都是存储到内存中,它的存储介质多种多样,实现序列化接口的目是二级缓存可能会使用硬盘临时存储,所以要实现序列化接口保证对象能够被序列化和反序列化。
只有当一级缓存,SqlSession对象使用完毕后能够关闭时,二级缓存才能正常命中,否则将会出现缓存命中为零的现象。