* 默认情况下只启用了本地会话缓存 即: 一级缓存, 它仅仅对一个会话中的数据进行缓存。
* 全局缓存(二级缓存)是基于namespace的缓存,一个namespace对应着一个Mapper接口。不同的SqlSession对象可以读取同一个mapper的缓存数据。
* 但是所有的缓存数据都会先放在一级缓存中,只要一级缓存关闭的时候,才会转存到二级缓存中。
* 工作原理:
- 一个会话查询了一条数据,那么该条数据就会放在当前会话的一级缓存中。
- 如果当前会话结束,SqlSession关闭了,那么所对应的缓存也就失效了。
- 但是因为开启了二级缓存,会将一级缓存中的数据存储到二级缓存中。
- 不同Mapper所查询出的数据会存放在自己的缓存中(Map),每个Mapper都有自己的缓存空间,相对独立。
* 如果开启全局范围的二级缓存,需要在Mapper.xml文件中进行配置。添加<cache/>标签。
* <catch>标签的属性
<cache
eviction="FIFO" :设置缓存清除策略 可用的清除策略有:见下文。
flushInterval="60000" :设置缓存自动刷新间隔时间
size="512" :最多可以存储512个引用
readOnly="true" : 设置是否只读
/>
* 可用的缓存清除策略有:
- LRU – 最近最少使用:移除最长时间不被使用的对象。
- FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
- SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
- WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
* 开启全局缓存(二级缓存) 的步骤
1. 在Mybatis核心配置文件Mybatis-config.xml中的<Settings>标签中设置缓存属性开启
| cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 true | false 。 默认为true
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
2. 在需要使用二级缓存的Mapper.xml中添加<catch>标签,并设置相关属性
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true" />
* 手动清理缓存
//手动清理缓存
sqlSession.clearCache();
原文:https://www.cnblogs.com/szqengr/p/14745911.html