Mybatis的缓存包括一级缓存和二级缓存。
一级缓存是SqlSession级别,在同一个SqlSession对象中使用,是自动开启,不能关闭,只能清除;二级缓存mapper级别,可在多个SqlSession中共享,需要手动开启。
一级缓存
同一个SqlSession对象,在没有收到改变数据的请求之前,第二次查询直接从缓存中取出上次查询的结果。
缓存失效:1.不是同一个SqlSession对象 2.两次的查询条件不同 3.在两次查询之间,有增、删、改commit,会清空缓存 4.两次之间手动清空缓存clearCache()。
二级缓存
1.mybatis的全局配置文件中手动开启:
<settings><setting name="cacheEnabled" value="true" /></settings>
2.在相应的mapper映射文件中 加入
<mapper namespace="...">...<cache eviction="FIFO" />...</mapper>"
缓存失效:在两次查询之间,有增、删、改commit,会清空缓存。mapper中的所有缓存绑定在同一个命名空间中,一条语句对数据的更改会删除所有的mapper级缓存,可以通过配置useCache 和 flushCache改变默认的方式,实现每条语句与mapper的缓存交互。
- 禁用
<select>
的二级缓存,useCache="false"
,默认为true
针对每次查询都去数据库查询数据
<select id="getIyId" parameterType="java.lang.Integer" ... useCache="false">
4.刷新某个<select>
使用flushCache
// 每条语句的flushCache 和 useCache的默认方式
<select ... flushCache="false" useCache="true"/>
<insert ... flushCache="true"/>
<update ... flushCache="true"/>
<delete ... flushCache="true"/>
- 默认二级缓存是关闭的,可以设置全局打开,但在使用中一般是针对某个mapper的namespace打开二级缓存,所有的select都会打开二级缓存。
<mapper namespace="***">
<cache eviction="LRU" flushInterval="10000"/>
或
<mapper namespace="***">
</cache>
需要关闭namespace下的某个查询的二级缓存
<select *** useCache="false">
可选择的回收策略
LRU – 最近最少使用的:移除最长时间不被使用的对象。(默认)
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。