一、一级缓存
基于perpetualCache的hashmap本地缓存,其存储作用域为session,当session flush 或close 之后,该session 中所有cache就将清空,默认打开一级缓存
二、二级缓存
二级缓存与一级缓存其机制相同,默认也是perpetualCache的hashmap缓存,不用在于其作用域为mapper(namespace),并且可自定义存储源,如Ecache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现serializable序列化接口(可用来保存对象的状态),可在他的映射文件中配置<cache/>
备注:对于缓存数据更新机制,当某一个作用域(一级缓存session/二级缓存namespaces)的进行了C/U/D操作后,默认该作用域下所有的select 中缓存都将被clear
三、spring当中为什么mybatis的一级缓存会失效的原因
1.spring的SqlSessionTemplate继承了sqlsession接口,而且在方法中加多了一层代理,只要开启事务则可以重新开启mybatis一级缓存
参考:你凭什么说Spring会导致MyBatis的一级缓存失效! - 腾讯云开发者社区-腾讯云
四、mybatis的二级缓存存在什么问题?怎么避免?
1. 只能在【只有单表操作】的表上使用缓存
不只是要保证这个表在整个系统中只有单表操作,而且和该表有关的全部操作必须全部在一个namespace下。
2. 在可以保证查询远远大于insert,update,delete操作的情况下使用缓存
这一点不需要多说,所有人都应该清楚。记住,这一点需要保证在1的前提下才可以!