基于白嫖:【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂
1 简介
每一次查询都需要去数据库取,消耗较大;将数据库部分数据放到内存中暂存,称之为缓存;经常查询并且不经常改变的数据可以建议使用缓存;
2 mybatis缓存
Mybatis系统中默认定义了两级缓存:一级缓存和二级缓存。
- 默认情况,开启一级缓存。(SQLSession级别,也被称为本地缓存);
- 二级缓存需要手动开启配置,基于
namespace
级别的缓存; - 为了提高扩展性,Mybatis定义了缓存接口Cache,可以通过实现Cache接口来自定义二级缓存;
3 一级缓存
public void getBlogTest() {
try (SqlSession sqlSession = MybatisUtils.getSqlSession()) {
//建立映射
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
Blog blog1 = mapper.getBlogById(1);
Blog blog2 = mapper.getBlogById(1);
logger.debug(blog1==blog2);
}
}
返回的是true
,blog1
和blog2
是同一个对象,即在堆内存中是一个对象;
- 映射语句文件中所有的
select
语句的结果会被缓存; insert
、update
、delete
语句会清空缓存;sqlSession.clearCache();
会清空缓存;- 当缓存满时,使用最近最少使用算法(
LRU
)来清除不需要的缓存;
一级缓存的作用域就是在一个SqlSession
中,作用域可以说是非常小的;
4 二级缓存
也叫全局缓存,需要在mybatis-config.xml
中开启二级缓存。
<!--设置-->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
在mapper.xml
中开启缓存;
<cache eviction="FIFO" flushInterval="60000"/>
可以设置更新策略,可以设置每隔多少时间就刷新的策略;
- 二级缓存的作用域是一个
namespace
,也就是说是针对一个接口设计的; - 一次查询流程:先看二级缓存有无,无则再看一级缓存有没有,无则去数据库查,存入一级缓存,
sqlSession
关闭则存入二级缓存;