一级缓存
本地缓存(Map): 与数据库同一次会话期间查询到的数据会放在本地缓存中
如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库
(类似于在同一个“事务”中多次查询不会多次查询数据库)
失效情况:
1.多个sqlSession对象查询(多个会话会创建自己的本地缓存)
2.查询不同的条件
3.两次查询之间执行了增删改操作
4.手动清除了本地缓存 sqlSession.clearCache()
二级缓存
全局缓存:本地缓存的局限性,多次会话不能共享数据(多个sqlSession对象)
基于namespace级别的缓存,一个namespace对应一个二级缓存
工作机制:
1.一个会话查询数据,这个数据就会被放在当前会话的一级缓存中
2.如果当前会话关闭,对应一级缓存的数据会被保存到二级缓存中
3.新的会话查询。就可以参照二级缓存
mapper文件(namespace)(二级缓存) -> sqlsession通过mapper文件查询数据(一级缓存)
每个sqlsession都会基于mapper文件创建,所以二级缓存是全局缓存
cacheEnabled true
<setting name="cacheEnable" value="true" />
<cache eviction="" flushInterval="" readOnly="" size="" type=""></cache>
LRU:最近最少使用的
FIFO:先进先出
SOFT:软引用
WEAK:弱引用
默认不清空
true 只读 mybatis认为每次都只是获取数据操作,所以会直接将数据引用交给用户,提高效率,不安全
false 非只读,mybatis认为每次操作都可能会修改数据,所以会使用序列化和反序列化克隆一份数据,默认
缓存相关配置
1.cacheEnable = true 开启缓存 false 只关闭二级缓存 (settings配置)
2.每个select标签默认都有useCache = "true" false 只关闭二级缓存
3.每个增删改标签默认都有flushCache="true" 每次执行完之后会删除缓存,一二级缓存都清除
查询标签添加flushCache="true" 每次执行完删除缓存,就相当于没有使用缓存
4.sqlSession.clearCache() 只清除一级缓存,因为是会话方法 (sqlSession方法)
5.localCacheScope 本地缓存作用域,默认SESSION开启一级缓存,STATEMENT关闭一级缓存 (settings配置)
原理图
第三方cache
mybatis-ehcache
https://mybatis.org/ehcache-cache/