1. 首先在mybatis配置文件中配置整体开启二级缓存。
<settings> <setting name="cacheEnabled" value="true"/> </settings>
2. 在mapper.xml文件中配置缓存策略
<cache eviction= "LRU" flushInterval= "100000" readOnly= "true" size= "1024"/>
参数说明:
- eviction代表缓存回收策略,目前mybatis提供以下回收策略:
- LRU(Least Recently Used):最近最少使用的,回收最长时间不用的对象;
- FIFO(First in first out):先进先出,按照对象进入缓存的顺序来移除;
- SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象;
- WEAK:弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象。
- flushInterval:缓存刷新时间间隔,单位为毫秒,每经过相应时间会对缓存进行刷新,如果没有配置,当SQL被执行的时候才会刷新缓存。
- readOnly:只读,设置只读为“true”意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是没有办法修改缓存,它的默认值是false,不允许修改。
- size:引用数目,是一个整数,代表缓存最多可以存储多少的对象,该数据不宜设置过大,如果设置过大会导致内存溢出。
3. 测试缓存配置:
4. useCache和flushCache
mybatis中还可以配置userCache和flushCache等配置项:
userCache是用来设置是否禁用二级缓 存的,在statement中设置useCache=false可以禁⽤当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存,还可以使用注解方式禁用@Options(useCache=false),flushCache的注解配置方法同上 。
方法一:
<select id="selectUserByUserId" useCache="false"
resultType="com.lagou.pojo.User" parameterType="int">
select * from user where id=#{id}
</select>方法二:
@Options(useCache = false)
@Select({"select * from user where id = #{id}"})
public User findUserById(Integer id);
- 这种情况是针对每次查询都需要最新的数据sql,要设置成useCache=false,禁用二级缓存,直接从数 据库中获取。
- 在mapper的同一个namespace中,如果有其它insert、update, delete操作数据后需要刷新缓 存,如果不执行刷新缓存会出现脏读。
- 设置statement配置中的flushCache="true”属性,默认情况下为true,即刷新缓存,如果改成false则 不会刷新。使用缓存时如果⼿动修改数据库表中的查询数据会出现脏读。
方法一:
<select id="selectUserByUserId" flushCache="true" useCache="false"
resultType="com.lagou.pojo.User" parameterType="int">
select * from user where id=#{id}
</select>方法二:
@Options({useCache = false, flushCache="true"})
@Select({"select * from user where id = #{id}"})
public User findUserById(Integer id);
一般下执行完commit操作都需要刷新缓存,flushCache=true表示刷新缓存,这样可以避免数据库脏读。所以我们不用设置,默认即可