这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
🔹 一级缓存(本地缓存)
一级缓存是本地或者说局部缓存,它不能被关闭,只能配置缓存范围。SESSION 或者 STATEMENT。 设置
mybatis.configuration.local-cache-scope=session
两个特点:
1,同一个session会话 修改操作执行后 一级缓存失效
2,两个session会话不共享缓存 导致会出现脏数据 MyBatis 缓存分为两级
-
作用范围:默认开启,作用于 SqlSession 级别。
-
原理:同一个 SqlSession 中执行相同的 SQL(参数一致),第二次会从缓存中取,不再访问数据库。
-
失效情况:
- SqlSession 关闭或清空缓存(
session.clearCache()) - 执行了
insert/update/delete,会清空缓存 - 查询参数不同
- Mapper 是不同的 SqlSession
- 如果Spring Boot 时开启了事务管理(例如使用了
@Transactional),一个事务通常对应一个SqlSession。
- SqlSession 关闭或清空缓存(
🔸 二级缓存(全局缓存)
-
作用范围:多个 SqlSession 之间共享,基于 namespace。
-
配置方式:
- 开启全局缓存:
<setting name="cacheEnabled" value="true"/> - Mapper 中加
<cache/>标签开启该 namespace 的缓存 - 实体类需实现
Serializable接口
- 开启全局缓存:
-
注意事项:
- 必须是同一个 namespace 下的 SQL 才能共用缓存
- 默认使用 PerpetualCache(永久缓存)+ LRU 算法 + 同步写入策略
- 可自定义缓存实现