和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

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,二级缓存生效
}




缓存读取顺序

  1. 看二级缓存有咩有,有就拿走(●ˇ∀ˇ●)
  2. 看一级缓存有没有
  3. 查询数据库
posted @ 2021-07-27 19:52  klaus08  阅读(31)  评论(0)    收藏  举报