Mybatis有两级缓存
一级缓存(本机缓存):一级缓存是一直开启的。sqlSession级别缓存的Map
与数据库同一次回话期间(session没有断开)查询到的数据会放在本地缓存(一级缓存)
之后如果获取相同的数据,直接从缓存中拿,没必要再去查询数据库
一级缓存失效情况(不使用当前一级缓存的情况)
1、sqlSession不同,一级缓存失效
2、sqlSession相同,查询条件不同,一级缓存没有数据
3、sqlSession相同,两次查询期间,添加了增删改操作(这次增删改可能对缓存数据有修改)
4、sqlSession相同,手动清空了缓存。session.clearChache()
二级缓存(全局缓存):基于namespace级别的缓存
工作机制:
1、一个会话,查询一条数据,这个数据会放在当前会话的一级缓存中
2、如果会话关闭,一级缓存的数据会保存到二级缓存中;新的会话查询信息,可以参照二级缓存的内容。
3、不同的namespace查出的数据放在自己的缓存中
使用:
1、开启全局二级缓存配置:<setting name=”cacheEnabled” value=”true”><setting>
2、在mapper.xml中配置使用二级缓存
<cache></cache>
如果有工作空间配置过了,可以使用<cache-ref namespase>配置和工作空间相同的缓存机制
3、我们的POJO需要实现序列化接口
和缓存有关的设置
1、<select> useCache属性设置是否使用二级缓存
2、每个增删改标签:flushCache属性,每次增删改操作后就会清除缓存,一级和二级缓存中都会被清空。
3、session.clearCache只清除一级缓存
4、全局配置文件setting标签的cacheEnable属性;启用二级缓存
5、全局配置文件setting标签的localCacheScope属性;本地缓存作用域;
(一级缓存SESSION):当前会话的所有数据保存在会话缓存中
STATEMENT:可以禁用一级缓存