Mybatis提供了两个缓存级别:一级缓存,二级缓存。
一、一级缓存
我们知道Mybatis一级缓存是框架开启的,是属于一个SqlSession级别的缓存(和数据库会话的缓存也就是说它的作用域是会话范围),所以在一级缓存策略没有失效的情况下,同一个会话的重复查询,mybatis只会执行一次请求。后面的相同查询都会直接使用缓存(Map)的内容。
1.1 造成一级缓存失效的情况有四个
1.1.1 我们知道一级缓存的作用域是sqlSession,只要sqlSession对象不同。即使是同一个查下,缓存也是不起作用的。
1.1.2 执行语句的参数不同。会重新执行sql查下。
1.1.3 执行增,删,改,语句,会清空掉缓存
1.1.4 手动执行sqlSession.clearCache方法
二、二级缓存
2.1 二级缓存是全局缓存,是基于namespace级别的缓存(作用域是每个namespace),所以说不同的命名空间就有不同的二级缓存。
2.2 由于一级缓存的作用域是sqlSession范围,比较小,只要会话关闭了,那么它的一级缓存就不存在了,所有这时候我们需要使用二级缓存了。
2.2.1 在一级缓存的会话提交(sqlSession.commit())/会话关闭后(注意),如果mybatis的二级缓存开启,那么它会把一级缓存的数据保存到二级缓存的Map中。
二级缓存配置
要正确的使用二级缓存,需完成如下配置的。
在MyBatis的全局配置文件中开启二级缓存。
在MyBatis的映射XML中配置cache或者 cache-ref 。
cache标签用于声明这个namespace使用二级缓存,并且可以自定义配置。
type:cache使用的类型,默认是PerpetualCache
eviction: 定义回收的策略,常见的有FIFO,LRU。
(1)LRU最近最少使用策略,一处做长时间不被使用的对象。
(2)FIFO先进先出策略,按对象进入缓存的顺序来移除它们。
(3)SOFT软引用策略,移除基于垃圾回收器状态和软引用规则的对象。
(4)WEAK弱引用策略,更积极地移除基于垃圾收集器状态和弱引用规则的对象
flushInterval: 配置一定时间自动刷新缓存,单位是毫秒。
size: 最多缓存对象的个数。
readOnly: 是否只读,若配置可读写,则需要对应的实体类能够序列化。
blocking: 若缓存中找不到对应的key,是否会一直blocking,直到有对应的数据进入缓存。
cache-ref代表引用别的命名空间的Cache配置,两个命名空间的操作使用的是同一个Cache。
注意:默认的情况下,缓存的数据需要使用序列化&反序列,所以一般我们的POJO需要实现序列化接口。
参看
https://blog.csdn.net/yelvgou9995/article/details/81275006