MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。
默认情况下,只启用了本地的会话缓存,即一级缓存,它仅仅对一个会话即一个sqlsession中的数据进行缓存。
缓存失效的情况:
-
查询不同的东西
-
增删改操作,可能会改变原来数据,所以一定会刷新缓存
-
查询不同的Mapper.xml
-
手动刷新缓存
sqlSession.clearCache();//手动清理缓存
一级缓存默认是开启的,只在一次sqlsession中有效,本质为一个map。
8.2 二级缓存二级缓存也叫全局缓存,其作用域为一个namespace,一个命名空间对应一个二级缓存
工作机制
-
一个会话查询一个数据,这个数据就会被放在一级缓存中
-
如果当前会话关闭,则一级缓存就没了,我们要的是一级缓存失效后,会保存在二级缓存中
-
新的会话查询数据,就会从二级缓存中读取数据
-
不同的mapper查出的数据会放在自己的缓存(map)中
显式的开启全局缓存,虽然他默认是开启的,但还是声明一下比较明显
启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:
但是只写上面的会报错,因为二级缓存必须设定为只读,如果不设定则必须让实体类进行实例化。
这个更高级的配置创建了一个 FIFO 缓存,每隔 60 秒刷新,最多可以存储结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此对它们进行修改可能会在不同线程中的调用者产生冲突。
可用的清除策略有:
-
LRU – 最近最少使用:移除最长时间不被使用的对象。
-
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
-
SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
-
WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
默认的清除策略是 LRU。
flushInterval(刷新间隔)
size(引用数目)
readOnly(只读)
小结:
-
只要开启了二级缓存,在同一个mapper下就有效
-
所有的数据都会先放在一级缓存中
-
只有当会话提交或者关闭时才会提交到二级缓存中
8.4 自定义缓存的使用Ehcache 1.导坐标
2.在mapper中开启二级缓存org.mybatis.caches mybatis-ehcache1.2.1
3.导入ehcache.xml配置文件



