一.mybatis 两级缓存
1.一级缓存(本地缓存)
*1.使用
sqlSession级别的缓存(一个Map),一级缓存一直开启,与数据库同一次会话期间查询到的数据会放在本地缓存中,以后如果需要获取相同的数据,直接从缓存中取
*2.失效情况
- sqlSession不同
- sqlSession相同,查询条件不同(一级缓存中还没有这个数据)
- sqlSession相同,两次查询之间执行了增删改的操作
- sqlSession相同,手动清除了一级缓存
2.二级缓存(全局缓存)
基于namespace级别的缓存,一个namespace对应一个二级缓存
*1. 工作机制
- 一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中。如果会话关闭,一级缓存中的数据会被保存到二级缓存中,新的会话查询信息,就可以参照二级缓存
- 不同namespace查出的数据会放在自己对应的缓存中(map)
*2. 使用
**1. 开启全局二级缓存
**2. mapper.xml中配置使用二级缓存
对应的mapper会有二级缓存**3.实体类要实现序列化接口
- eviction(回收策略)
- LRU(默认) 移除最长时间不使用的对象
- FIFO 按对象进入缓存的顺序来移除
- SOFT 软引用,基于垃圾回收器状态和软引用规则移除对象
- WEAK 弱引用,基于垃圾回收器状态和软引用规则移除对象,更积极
- flushInterval(缓存刷新间隔):缓存多长时间清空一次,默认不清空,设置一个毫秒值
- readOnly(是否只读):
- true:mybatis认为所有从缓存中获取数据的操作都是只读,会直接把对对象的引用交给用户
- false: mybatis认为获取数据可能会被修改,利用序列化反序列克隆一份新数据给用户
- size(存放多少元素)
- type(指定自定义缓存全类名),实现Cache接口即可
3.缓存的相关配置
注:cacheEnable 是在全局mapper配置setting中的属性4.整合第三方缓存
mybatis自带有一二级缓存,并且提供了Cache接口,供用户使用第三方缓存,如ehCache、redisCache
- eviction(回收策略)