mybatis的一级缓存和二级缓存(1)
1.mybatis一级缓存,sqlSesion级别的缓存,一级缓存默认一直开启的,sqlSession级别的一个Map,把查询的数据放到一个Map中,以后需要相同的数据,直接从Map中去取
与数据库一次会话期间,查询到的数据会放到本地缓存中
以后需要相同的数据,直接从缓存中拿,不再去从数据中查询
2.mybatis一级缓存失效情况
(1)sqlSession不同
(2)sqlSession相同,查询条件不同,(如查询了id为1的员工,再去查id为2的员工,一级缓存失效,当前一级缓存还没有数据)
(3)sqlSession相同,两次查询之间执行了增删改查操作(这个增删改查可能对当前数据有影响)
(4)sqlSession相同,手动清除一级缓存,如使用openSession.clearCache()
3.mybatis二级缓存
场景:一个会话,查询一条数据,这个数据会被放到一级缓存中
如果会话关闭,一级缓存的数据会被保存到二级缓存中
不同的namespace查询的数据会放到自己对应的缓存中(map)
实现效果:数据从二级缓存获取
查询到的数据会默认放到一级缓存中
只有会话提交或者关闭,一级缓存中的数据才会被转到二级缓存中
使用二级缓存
(1)在mybatis-config.xml中配置
<!-- 全局启用mybatis二级缓存 -->
<setting name="cacheEnabled" value="true"/>
(2)在mapper.xml中添加<cache>标签
<cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"></cache>
eviction:缓存回收策略
LRU-最近最少使用的,移除最长时间不被使用的对象
FIFO-先进先出,按对象进入缓存的顺序来移除他们
SOFT-弱引用,移除基于垃圾回收器状态和软引用规则的对象
WEAK-弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象
默认的是LRU
flushInterval:缓存刷新间隔
缓存多长时间清空一次, 默认不清空,设置一个毫秒值
readOnly:是否只读
true:只读,mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据
mybatis为了加快获取速度,直接将数据在缓存的引用交给用户,不安全,速度快
false:非只读,mybatis觉得获取的数据可能会被修改
mybatis会利用序列化&反序列化的技术克隆一份新的数据给用户,安全,速度慢
默认为false
size:缓存最放多少元素
type:指定自定义缓存全类名
(3)POJO实现序列化接口 implements Serializable