MyBatis缓存
** 使用缓存的数据:**经常访问但不常改变的数据。
MyBatis 缓存
MyBatis 默认定义了两级缓存:一级缓存和二级缓存
- 默认情况下,只有一级缓存开始(sqlSession 级别的缓存,也叫本地缓存)
- 二级缓存需要手动开启并配置,是基于 namespace 级别的缓存
- 为了提高扩展性,MyBatis 定义了缓存接口 Cache,通过实现 Cache 接口定义二级缓存
一级缓存
缓存失效:
- 增删改操作会刷新缓存,刷新缓存中所有内容。如
@Test
public void testQueryUserById() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
/**************执行下面这段代码,打印结果就是false了*****************/
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("name", "klaus02");
mapper.updateUser(hashMap);
/*****************************************************************/
User user2 = mapper.queryUserById(1);
System.out.println(user == user2); // true,缓存里的
sqlSession.close();
}
-
查询不同的东西,缓存是有限的
-
查询在不同的 Mapper.xml
-
手动清理,如:
sqlSession.clearCache();
一级缓存,,很鸡肋,每个用户都会创建一个自己的 sqlSession,并且只有在同种操作时才会缓存生效。
二级缓存
二级缓存也称全局缓存,它的作用域是全局,就是整个 Mapper。
所有的数据都存在以及缓存中,只有当会话提交或关闭时,数据才会到二级缓存中。
要在配置文件中的 settings 中打开二级缓存(默认就是开启的,这里只是显式的声明一遍便于代码阅读),并且在 Mapper.xml 中添加<cache/>,还可以有一些缓存设置:
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
eviction是清楚缓存的策略:
LRU– 最近最少使用:移除最长时间不被使用的对象。FIFO– 先进先出:按对象进入缓存的顺序来移除它们。SOFT– 软引用:基于垃圾回收器状态和软引用规则移除对象。WEAK– 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
@Test
public void testQueryUserById() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
SqlSession sqlSession2 = MyBatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
/*******************************************/
User user = mapper.queryUserById(1);
sqlSession.close();
/*******************************************/
User user2 = mapper2.queryUserById(1);
sqlSession2.close();
System.out.println(user == user2); // true,二级缓存生效
}
缓存读取顺序
- 看二级缓存有咩有,有就拿走(●ˇ∀ˇ●)
- 看一级缓存有没有
- 查询数据库
本文来自博客园,作者:klaus08,转载请注明原文链接:https://www.cnblogs.com/klaus08/p/15104971.html

浙公网安备 33010602011771号