1.Mybatis二级缓存使用简介:
1.1:开启全局二级缓存配置:<setting name="cacheEnabled" value="true"></setting>
1.2:在对应的xxxmapper.xml文件加入<cache/>标签
注意:二级缓存是基于命名空间namespace的,一级缓存是基于sqlSession的,也就是与数据库之间的一次会话。
1.2.1:cache的相关属性介绍:
eviction: 缓存的回收策略
LRU(默认):最近最少使用,移除最长时间不被使用的对象
FIFO:先进先出,安对象进入缓存的顺序来移除它们
SOFT:软引用,移除基于垃圾回收器的状态和软引用规则的对象
WEAK: 弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象
flushInterval:缓存刷新间隔 缓存多长时间清空一次,默认不清空,设置一个毫秒值
readOnly:是否只读 。
true:只读,mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。 mybatis为了加快获取速度,直接会将数据在缓存中的引用交给用户,不 安全,但速度快。
false:非只读,mybatis觉得获取的数据可能会被修改 mybatis会利用序列化&反序列化的技术克隆一份新的数据给你,安全,但速度慢。
size:缓存最多存放多少个引用。
type:指定自定义缓存的全类名,实现Mybatis提供的Cache接口即可。
1.3:因为上面说到mybatis会用到序列化&反序列化技术克隆一份新的数据,所以对应的pojo需要实现序列化
2.mybatis二级缓存失效的原因
2.1:下面这篇博客个人觉得已经总结的很全面了,传送门:
转载:https://www.cnblogs.com/DoubleEggs/p/6243223.html
2.2:补充一个比较简单但有时候比较容易忽略的场景(亲身经历):
自己写了一个工具类,来获取sqlSession,但是每次获取sqlSession的时候,都会重新加载mybatis全局配置文件,创建一个新的sqlSessionFactory,sqlSessionFactory不同自然也会导致二级缓存失效: