一、一级缓存
sqlsession级别缓存,默认开启;
MyBatis将数据存入一级缓存时,是将对象的引用(内存地址)存入一级缓存;在获取一级缓存中的数据时,MyBatis将返回当初存入一级缓存的那个内存地址值,也就是说,一级缓存中的数据是同一个
一级缓存失效:
- 将一级缓存的作用域设置为语句级别(localCacheScope设置为STATEMENT,默认为SESSION)
- 清空缓存(clearCache)
- 刷新缓存(flushCache)
- 执行任何增删改操作都会导致整个一级缓存失效
- session关闭,一级缓存清空
二、二级缓存
全局缓存(可以控制在mapper级别或者sql语句级别(useCache参数)),需要手动开启和配置;
session关闭时,将一级缓存中的数据写入二级缓存。
如果一级&二级缓存同时存在,会先查询二级缓存、再查询一级缓存(如果readOnly=false,存入二级缓存的对象必须实现序列号接口)
二级缓存失效:
- 执行任何的增删改操作,不仅会导致一级缓存清空,也会导致同一个namespace二级缓存清空
- 刷新缓存(flushCache)
可重写Cache接口,自定义二级缓存(比如使用redis)