参考文献:
MyBatis|缓存机制
mybatis一级缓存二级缓存
【MyBatis学习13】MyBatis中的二级缓存
1. mybatis 缓存
- 一级缓存:也称为本地缓存,用于保存用户在一次会话过程中查询的结果,用户一次会话中只能使用一个 sqlSession,一级缓存是自动开启的,不允许关闭。
- 二级缓存:也称为全局缓存,是 MyBatis 中 SqlSessionFactory 对象的缓存,是 namespace 级别的缓存,是针对一个表的查结果的存储,可以共享给所有针对这张表的查询的用户。也就是说对于 namespace 级别的缓存不同的 sqlsession 是可以共享的。
对一级缓存和二级缓存的作用范围做一个介绍:
-
一级缓存的作用范围为 sqlSession,即为一次 commit, 其实作用不大,如果我们想看一级缓存的效果,可以通过事务管理来进行 commit 的控制。
-
二级缓存的作用范围为 namespace, namespace 在 xml 中配置,一般一个 mapper 对应一个 namespce
<mapper namespace="mapper.ComAdminMapper"></mapper>
缓存查询的时候,先查询二级缓存,再查询一级缓存,最后看数据库。
2. 二级缓存
不同的 mapper 使用同一个 namespace,也是使用相同的缓存
我们看个示意图
增删改都会清空二级缓存。
2.1 使用
springboot 中 mybatis 的二级缓存是默认开启的。
不过 mybatis 缓存是在本地的,分布式情况下,会出现脏数据的情况,两端数据不一致,我们可以通过整合 redis 来解决。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
配置缓存管理器
spring.cache.type=redis
使用 spring cache 注解来管理缓存