两级缓存

一级缓存(本地缓存):

  • SqlSession级别的缓存。一级缓存一直都是开启的;
  • SqlSession级别的一个Map集合;
  • 与数据库同一次会话(同一个SqlSession)期间查询到的数据会放到本地缓存中,以后如果是获取相同的数据,直接在缓存中拿,不需要再去查询数据库。
一级缓存失效的情况(就是需要重新向数据库中发送数据)
  1. SqlSession不同。
  2. SqlSession相同,查询条件不同。(当前的一级缓存中还没有这个数据)
  3. SqlSession相同,但是这两次的查询之间有其他的增删改的操作。(可能会对要查询的数据产生影响)
  4. SqlSession相同,两次查询之间手动清除了缓存。session.clearCache();

二级缓存(全局缓存)

  • 基于namespace级别的缓存,一个namespace对应着一个二级缓存;
  • 工作机制
    1. 一个会话查询一个数据,那么这个数据就会放在一级缓存中;
    2. 如果会话关闭,那么保存在一级缓存中的数据就会被保存在二级缓存中,那么再次查找相同的数据,会优先查找缓存中的数据;
    3. 不同的namespace(javaBean)查询出的数据,会放在自己的二级缓存中;
  • 使用
    1. 开启全局配置:<setting name='cacheEnabled' value='true' />
    2. POJO需要实现序列化接口
    3. 去对应的mapper.xml中开启二级缓存:<cache></cache>

和缓存有关的配置

  1. 全局配置中的<setting name='cacheEnabled' value='true' /> 关闭二级缓存,一级缓存可用;
  2. mapper.xml中的每个select标签都有属性:useCache='true',设置为false时,关闭二级缓存,一级缓存可用;
  3. mapper.xml中的每个增删改标签都有属性:flushCahce='true',在执行完操作之后,一级二级都会被清除;
  4. mapper.xml中的每个select标签都有属性:flushCache='false',设置成true之后,执行查询操作之后也会清除缓存;
  5. sqlSession.clearCache()方法,只是清除了当前session的一级缓存;
  6. 全局配置中的<setting name='localCacheScope' value='SESSION'>:默认是SESSION,启用一级缓存,当值为STATEMENT的时候,可以禁止使用缓存;
最后修改日期:2020-07-13

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。