一级缓存,sqlSession级别的缓存
一级缓存失效:
- sqlSession不同
- 查询条件不同
- sqlSession相同,两次查询期间执行了增删改,可能对当前数据有影响
- 调用了sqlSession.clearCache()
二级缓存,基于namespace级别的缓存,一个mapper.xml对应一个namespace<mapper namespace="com.xxx.dao.xxxMapper">
机制:
- 一个会话sqlSession,查询一条记录,这个记录会保存到一级缓存中
- 如果会话<font color="red">关闭</font>,一级缓存的记录会保存到二级缓存中
配置:
<setting name="cacheEnabled" value="true"/>
<mapper>
<cache eviction="" flushInterval="" readOnly="" size="" type=""></cache>
</mapper>
eviction缓存回收策略:
LRU:最近最少使用,移除最长时间不被使用的对象,默认
FIFIO:先进先出
SOFT:软引用,基于GC回收机制
WEAK:弱引用
flushInterval缓存刷新间隔
缓存多长时间清空一次,毫秒单位
readOnly缓存是否只读
true:将引用交给用户
false:基于序列化克隆对象给用户 默认
size缓存存放多少个元素
type自定义缓存全类名,因为mybatis不是专业做缓存的,可以自定义缓存实现类,实现Cache接口,POJO需要实现序列化接口
缓存的配置
cacheEnabled false:只关闭二级缓存
useCache false:一级缓存依旧使用,不适用二级缓存
<select useCache=""/>
- flushCache true:执行时,清空一级和二级缓存
<insert update delete flushCache=""/>
调用sqlSession.clearCache() 不清空二级缓存
localCahceScope 本地缓存作用域 ,STATEMENT:可以禁用一级缓存
<setting name="localCacheScope" value="STATEMENT"/>