Mybatis存在一级缓存和二级缓存
一级缓存:默认开启。
二级缓存:手动开启。二级缓存默认是不开启的,需要手动开启二级缓存,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。
public class Blog implements Serializable {
private String id;
private String title;
private String author;
private Date createTime;
private int views;
}
在myBatis-config 中添加开启二级缓存的条件
<!-- 通知 MyBatis 框架开启二级缓存 -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
还需要在 Mapper 对应的xml中添加 cache 标签,表示对哪个mapper 开启二级缓存
<!-- 表示DEPT表查询结果保存到二级缓存(共享缓存) -->
<cache/>
useCache可以对具体的sql进行开关缓存操作,关闭则不会提交到二级缓存
<!--可以对具体的sql进行开关缓存操作,关闭则不会提交到二级缓存-->
<select id="queryBlog" resultType="blog" useCache="true">
select * from mybatis.blog
</select>
作用范围:
一级缓存(本地缓存)
作用于sqlSession,从创建到关闭。
二级缓存(全局缓存)
作用于Mapper,当会话对应的一级缓存关闭时,会将缓存数据提交到二级缓存。新的会话查找会先从二级缓存中查找,找不到再到一级缓存。可以多个sqlSession共享缓存。
缓存策略(刷新缓存)
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
LRU
– 最近最少使用:移除最长时间不被使用的对象。FIFO
– 先进先出:按对象进入缓存的顺序来移除它们。SOFT
– 软引用:基于垃圾回收器状态和软引用规则移除对象。WEAK
– 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
注意:
- 映射语句文件中的所有 select 语句的结果将会被缓存。
- 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
- 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
自定义缓存
<cache type="com.domain.something.MyCustomCache"/>