一级缓存(本地缓存)
sqlsession级别的缓存,一级缓存是一直开启的,sqlsession几倍的一个与数据库同一次会话期间查询到的数据会放到本地缓存中
失效的情况
1.不同的sqlsession
2.同一个sqlsession,参数不同(当前缓存中没有这个数据)
3.sqlsession相同,两次查询期间执行了增删改操作(这次增删改可能对数据有影响)
4.sqlsession相同,手动清空了一级缓存
二级缓存
基于namespace级别的缓存,一个namespace对应一个二级缓存
工作机制:
1.一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中;
2.如果会话关闭:一级缓存中的数据会被保存到二级缓存中
3.不同namespace查出的数据会放在自己对应的缓存中
数据会从二级缓存中获取,查出的数据都会被默认放在一级缓存中,只有会话提交或者关闭后一级缓存中的数据才会转移到二级缓存中
使用:
1.开启全局二级缓存配置:
2.mapper.xml中配置使用二级缓存
3.POJO需要实现序列化接口
eviction:缓存的回收策略
LRU-最近最少使用的,移除最长时间不被使用的对象
FIFO- 先进先出:按对象进入缓存的顺序来移除它们
SOFT - 软引用:移除基于垃圾回收器状态和软引用规则的对象
WEAK- 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象
默认的是LRU
flushInterval:缓存刷新间隔
缓存多长时间清空一次,默认不清空,设置一个毫秒值
readonly:是否只读
true:只读,mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据 , mybatis为了加快获取速度,直接就会将数据在缓存中的引用交给用户,不安全,速度快
false:非只读,mybatis觉得获取的数据可能会被修改
mybatis会利用序列化和反序列化的技术克隆一份新的数据给你,安全,速度慢
size:缓存存放多少元素