【SSM - MyBatis篇11】MyBatis缓存,spring整合MyBatis开启二级缓存,MyBatis开启二级缓存

文章目录

    • 1. MyBatis缓存机制
      • 1.1 一级缓存、二级缓存
      • 1.2 关于一级缓存(本地缓存)
      • 1.2 关于二级缓存
    • 2. Spring整合MyBatis开启二级缓存【*****】
      • 2.1 创建MyBatis核心配置文件,在settings中开启二级缓存
      • 2.2 在spring的核心配置文件中,sqlSessionFactory的bean中,将mybatis的配置粘入
      • 2.3 在mapper.xml映射文件中添加< cache >< /cache >开启二级缓存
      • 2.4 在对应的javabean类实现序列化接口Serializable(仅仅是一个标识作用,不实现会报错)(如果缓存cache的readOnly属性为true,就可以不设置)
    • 3. MyBatis中开启二级缓存
    • 4. Spring整合MyBatis实现二级缓存案例
      • 4.1 创建customer表
      • 4.2 创建javabean对象
      • 4.3 创建dao层接口
      • 4.4 创建连接数据库的属性文件db.properties(键值对形式)
        • 4.5 MyBatis核心配置文件开启二级缓存
      • 4.6 spring整合MyBatis,在sqlSessionFactory的bean中,将mybatis配置粘入bean的property中
      • 4.7 映射文件mapper.xml中加入< cache/ >实现二级缓存
      • 4.8 创建测试类
        • 4.8.1 数据准备
        • 4.8.2 测试一级缓存

1. MyBatis缓存机制

1.1 一级缓存、二级缓存

   一级缓存:它指的是Mybatis中sqlSession对象的缓存(基于PerpetualCacheHashMap本地缓存,作用域是Session),当我们执行查询以后,查询的结果会同时存入到SqlSession为我们提供的一块区域中,该区域的结构是一个Map集合,当我们再次查询同样的数据,mybatis会先去sqlsession中查询是否有,有的话直接拿出来用,当SqlSession对象消失时,mybatis的一级缓存也就消失了,同时一级缓存是SqlSession范围的缓存当调用SqlSession对象的修改、添加、删除、commit()、flush、close等方法时,就会清空一级缓存。

   二级缓存:是Mybatis中SqlSessionFactory对象的缓存(默认也是采用 PerpetualCacheHashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache),由同一个SqlSessionFactory对象创建的SqlSession共享其缓存,但是其中缓存的是数据而不是对象,所以从二级缓存再次查询出的结果的对象与第一次存入的对象是不一样的。(就是二级缓存存下来的是对象的数据(堆中具体存放的数据,而不是对象的引用,所以如果修改对象的值,但是二级缓存里面该对象的数据是不变的))

   MyBatis的缓存数据更新机制中,当某一个作用域(不管是一级缓存sqlSession/二级缓存SqlSessionFactory)的进行了C/U/D 操作后,默认该作用域下所有select查询中的缓存都将被clear(因为数据被改变更新,所以缓存就无效了,继续使用就可能是没有更新的数值)
   update、delete、insert修改数据库的方法,无论是否commit提交,会同时清空一级和二级缓存。


1.2 关于一级缓存(本地缓存)

缓存:就是把数据放到内存数据中,下次使用直接去缓存(内存)中查找
MyBatis的一级缓存默认是开启状态,且不能关闭,开发人员不需要管理它。
一级缓存对于不同的session对应各自的缓存,session之间不能相互访问对方的缓存(session间不共享缓存)
当一个 SqlSession 关闭和提交时,该 SqlSession 中的一级查询缓存也会清空。
可以通过session.clearCache();来清空一级缓存

数据查询时:

  • 第一次查询后,将数据放入一级缓存中,也就是默认缓存。
  • 第二次查询,会先从一级缓存中查询数据,如果命中(缓存中找到):使用一级缓存数据 ;如果未命中:发sql语句去数据库查询然后返回结果。

1.2 关于二级缓存

  • MyBatis的二级缓存是mapper范围级别的(namespace)
  • 二级缓存是默认开启的。(想开启就不必做任何配置)
  • SqlSession关闭后才会将数据写到二级缓存区域

每个sql语句都可以有一个针对二级缓存的设置(sql语句中的useCache属性)
  除了遵循大的< cache >设置外,针对每一条sql语句可以单独设置是否使用二级缓存。通过useCache="true"开启二级缓存,false关闭二级缓存。如果缓存设置flushCache="false" ,那么缓存将不清空。