Mybatis的缓存机制

Mybatis缓存介绍

Mybatis本身包含了一个强大的查询缓存特性,大幅提升了查询的效率,分为一级缓存二级缓存

  • 一级缓存:也叫本地缓存,默认开启,作用范围为Sqlsession级别,
  • 二级缓存:需要配置开启,作用范围为基于mapper的namespace级别
  • 同时也提供了对外的缓存接口,支持接入第三方缓存组件,如Memcache、OScache、EHcache等

原理图

一级缓存原理

  • 在一次数据库会话中(同一个sqlSession中),操作数据库时需要构建Sqlsession对象,在该对象会以HashMap的数据结构储存缓存数据
  • 当执行查询语句时,会在缓存中进行获取,未获取到将会查询数据库,并将数据写入到缓存,后续同样的查询将会在缓存中获取数据
  • 当SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用;若调用clearCache(),会清空PerpetualCache对象中的数据

二级缓存原理

原理

二级缓存的作用域是整个SqlSessionFactory实例(通常一个 MyBatis应用程序只需要一个SqlSessionFactory实例)
所以通过SqlSessionFactory实例获取到的SqlSession实例能够共享MyBatis的二级缓存

使用条件

  1. 配置中开启二级缓存:mybatis-config.xml中的cacheEnabled配置未被设置为false,或者application.yaml的mybatis下configuration下设置cache-enabled: true配置项
    xml方式:此时在需要配置二级缓存对象的映射(mapper.xml)的标签内配置即可
    注解方式:在接口对象xxxDao.java(或**
    Mapper.java)上添加@CacheNamespace注解
    xml和注解的方式只能二选一
  2. 配置的对象必须是可序列化的,即实现Serializable接口
  3. 只有提交(执行SqlSession#commit方法)或关闭(执行SqlSession#close方法)时数据才会被提交到缓存中

默认配置

  1. 所有 select 查询语句的结果都会被缓存;
  2. 执行 insert 语句,update 语句和 delete 语句后会刷新(清空)缓存;
  3. 缓存默认使用 LRU 淘汰策略来实现缓存淘汰;
  4. 缓存不会进行定时刷新;
  5. 缓存的默认大小是 1024 个;
  6. 缓存被设置为读/写缓存,这表示通过缓存获取到的对象并不是共享的,并且允许修改缓存

如需定制化配置请自行查阅<cache/>标签的属性和配置

清除二级缓存

同namespace下,执行insert、update、delete方法会清除二级缓存

使用第三方缓存

这个倒是没怎么用过,先找一篇文章mark一下,后续有机会试试
SpringBoot整合Redis配置MyBatis二级缓存