mybatis缓存机制
一级缓存(本地缓存,开启)
二级缓存手动开启和配置,基于namespace级别的缓存
一级缓存(本地缓存):sqlsession级别的缓存,一级缓存是一直开启的(与数据库同一个会话期间查询到的数会放在本地缓存中)
相同数据只需从本地缓存中拿,不需要查询数据库
一缓:1、sqlSession不同
2、sqlSession相同,查询条件不同
3、sqlsession相同,两次查询之间执行了增删改操作
4、sqlSession相同,手动清除了一级(缓存清空)
二级缓存(全局缓存):基于namespase级别的缓存,一个namespace对应一个二级缓存
工作机制:1、查询一条数据,这个数就会被放在当前会话的一级缓存
2、如果会话关闭,一级缓存会被保存到三级缓存,新的会话查询信息
3、sqlSession==EmployeeMapper====>Employee
1、<setting name="cacheEnabled" value="true" />
2、在mapper.xml中配置使用二级缓存
<cache eviction="FIFO" flushInterval="6000" readOnly">
3、pojo实现序列化接口
eviction :缓存的回收策略 LRU:最近最少使用
FIFO:先进先出
SOFT:软引用
WEAK:弱引用
readonly:是否只读
true:只读,mybatis认为所有从数据的操作都是只读操作,不修改数据
false:非只读,mybatis获取的数据可能会被修改
size:缓存存放多少元素
type:指自定义缓存的全类名
fluashInternal:缓存刷新间隔(缓存多长时间清空一次)
效果:数据会从二级缓存中获取
查出的数据都会被默认放在一级缓存中
只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存
缓存属性:1、cacheEnable:false 关闭缓存(二级缓存)一级缓存不可用
2、每个select标签都有useCache=”true“ false 一级缓存依然使用,二级缓存不可用
3、每个增删改标签flushcache="true" 增删改标签执行完成后清除缓存(一级缓存、二级缓存都清除)
4、查询标签flushcache="false"如果flushcache=true(每次查询都清除缓存)
5、sqlsession.clearcache():只清除session的一级缓存
6、localcachescope:本地缓存作用域:当前会话所有数据保存在当前缓存中