Mybatis缓存简介

  • MyBatis系统中默认定义了两级缓存:一级缓存二级缓存
    • 默认情况下,只有一级缓存开启,一级缓存无法关闭。(SqlSession级别的缓存,也称为本地缓存)
    • 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
    • 为了提高扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存
  • mybatis缓存了解即可,一级缓存自动启用无法关闭,二级缓存个人感觉没啥必要,直接使用redis来缓存即可,而且二级缓存包含数据太广,大量数据走缓存数据就不是最新

    一级缓存

  • 与数据库同一次会话期间查询到的数据会放在本地缓存中。以后如果需要获取相同的数据,直接从缓存中拿,没必须再去查询数据库;

  • 一级缓存不生效的情况:

    • 使用的sqlSession不同(配置了连接池可能会使得每次查询都使用新的sqlSession,这能避免读取到脏数据,保证线程安全)
    • sqlSession相同,查询条件不同。因为数据库不存在该条件数据所以不走缓存
    • sqlSession相同,两次查询之间执行了增删改操作!因为增删改操作可能会对当前数据产生影响所以不使用缓存
    • sqlSession相同,手动清除一级缓存
      1. SqlSession session = MybatisUtils.getSession();
      2. ...
      3. session.clearCache();//手动清除缓存

      二级缓存

  • 二级缓存是namespace级别的缓存,命名空间即一个mapper接口。所以二级缓存作用就是只要查询是在同一个mapper接口中的查询,就会尝试从二级缓存里拿数据

    • 查出的数据都会被默认先放在一级缓存中
    • 只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中