默认情况下,MyBatis开启了一级缓存。它是SqlSession内部的一个缓存。
二级缓存是需要手动开启的,并且它是跨 SqlSession 的缓存,二级缓存是基于namespace级别的,一个命名空间对应一个二级缓存。
注意:我们在使用缓存的时候要记得序列化实体类,否则会抛出实体类未序列化异常。
开启步骤:
在 mybatis-config.xml 的配置文件中进行显示配置,开启二级缓存(全局缓存)
- <settings>
- <setting name="cacheEnabled" value="true"/>
- </settings>
在 Mapper.xml 文件中添加cache标签
<cache eviction= "LRU" flushInterval= "100000" readOnly= "true" size= "1024"/>
具体参数说明:
LRU(Least Recently Used):最近最少使用的,回收最长时间不用的对象;
FIFO(First in first out):先进先出,按照对象进入缓存的顺序来移除;
SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象;
WEAK:弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象。
userCache是用来设置是否禁用二级缓 存的,在statement中设置useCache=false可以禁⽤当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存,还可以使用注解方式禁用@Options(useCache=false),flushCache的注解配置方法同上 。
- 方式一:
-
- <select id="selectUserByOrderId" useCache="false"
- resultType="com.baixinda.bean.Order" parameterType="int">
- select * from order where id=#{id}
- </select>
-
- 方式二:
-
- @Options(useCache = false)
- @Select({"select * from order where id = #{id}"})
- public User findOrderById(Integer id);
这种情况是针对每次查询都需要最新的数据sql,要设置成useCache=false,禁用二级缓存,直接从数 据库中获取。
在mapper的同一个namespace中,如果有其它insert、update, delete操作数据后需要刷新缓 存,如果不执行刷新缓存会出现脏读。
设置statement配置中的flushCache="true”属性,默认情况下为true,即刷新缓存,如果改成false则 不会刷新。使用缓存时如果⼿动修改数据库表中的查询数据会出现脏读。
- 方式一:
-
- <select id="selectUserByOrderId" flushCache="true" useCache="false"
- resultType="com.baixinda.bean.Order" parameterType="int">
- select * from order where id=#{id}
- </select>
-
- 方式二:
-
- @Options({useCache = false, flushCache="true"})
- @Select({"select * from order where id = #{id}"})
- public User findOrderById(Integer id);
另外:一般情况下执行完commit操作都需要刷新缓存,flushCache=true表示刷新缓存,这样可以避免数据库脏读。所以我们不用设置,默认即可 。