mybatis分为一级缓存、二级缓存
语句顺序:先查二级缓存 → 再查一级缓存 → 最后才去数据库查找
一、一级缓存(默认状态开启) SqlSession级别缓存。开启一个SqlSession级别的map进行保存
生效:使用同一个SqlSession并且没有做过增删改(第一次查询与第二次查询之间)、或者手动清除缓存的操作(sqlSession.clearCache();),一级缓存都生效。
失效:
1.SqlSession不同,以下语句创建两次视为不同
SqlSession sqlSession = sqlSessionFactory.openSession();
2.SqlSession相同,查询条件不同(如果不同条件查询一次后,就会生成缓存)
3.SqlSession相同,两次查询之间执行了增删改
4.SqlSession相同,手动清除一级缓存。执行了: sqlSession.clearCache();
二、二级缓存(基于namespace,一个namespace对应一个二级缓存)
1.当会话关闭时,一级缓存的数据将被保存到二级缓存中(前提是二级缓存被开启)
2.开启二级缓存
2.1 mybatis-config.xml配置 cacheEnabled默认为true(如果为false,则关闭二级缓存,但是一级缓存可以正常使用)
<settings>
<setting name="cacheEnabled" value="true"></setting>
</settings>
2.2 MyBatisMapping.xml配置
<cache></cache>
<!-- 如果没有在<mapper>中定义cache这个标签就不会开启二级缓存,即使config.xml中配置了开启 -->
<!--
cache属性说明
eviction="FIFO"
LRU – 最近最少使用:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
flushInterval="60000"
size="512"
readOnly="true"
flushInterval(刷新间隔)属性可以被设置为任意的正整数,设置的值应该是一个以毫秒为单位的合理时间量。 默认情况是不设置,也就是没有刷新间隔,缓存仅仅会在调用语句时刷新。
size(引用数目)属性可以被设置为任意正整数,要注意欲缓存对象的大小和运行环境中可用的内存资源。默认值是 1024。
readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false。
-->
三、缓存的配置(·以下第一条影响范围最高)
1.<setting name="cacheEnabled" value="true"></setting> value改为false二级缓存关闭,一级缓存正常
2.<cache></cache> 必须添加标签,二级缓存才能开启,
3.<select>标签中的属性useCache="true"如果为false则这条查询语句不使用二级缓存,一级缓存正常
4.sqlSession.clearCache();清除一级缓存,二级缓存不受限
四、flushCache 将其设置为 true 后,只要语句被调用,都会导致本地缓存(一级缓存)和二级缓存被清空,默认值:false。select、insert、update、delete、都能使用flushCache
五、sqlSession.close();与sqlSession.clearCache();区别
sqlSession.close();//清除会话
sqlSession.clearCache();//清除一级缓存
六、第三方缓存整合
因为mybatis做缓存不专业,所以提供了接口给redis等应用
1)、导入第三方缓存的jar包
2)、引入第三方缓存的xml配置文件
3)、在mapper中自定义缓存
<cache type="这里填写第三方缓存的类路径redis"></cache>