
【mybatis3】一级缓存和二级缓存
发布日期:2021-05-08 11:07:20
浏览次数:20
分类:精选文章
本文共 993 字,大约阅读时间需要 3 分钟。
MyBatis 缓存机制详解
一级缓存
1.1 一级缓存简介
MyBatis 的一级缓存默认开启,仅适用于同一个 SqlSession
,因此也称为 SqlSession
级别缓存。它用于缓存多次执行相同 SQL 语句的结果,避免重复数据库查询。
1.2 一级缓存失效情况
一级缓存在以下情况下会失效:
- 多个
SqlSession
开启:每个SqlSession
都有自己的缓存,多个会话会导致缓存失效。 - 入参不一致:即使使用同一个
SqlSession
,参数变化也会导致缓存失效。 - 数据库修改:一次修改操作后,再次查询相同 SQL 语句会失效。
- 手动清空缓存:调用
sqlSession.clearCache()
也会清空一级缓存。
1.3 一级缓存机制
一级缓存使用 PerpetualCache
实现,采用 HashMap 存储。缓存键由 sqlId
和解析后的 SQL 语句组成。查询完成后立即存入缓存,与事务无关。
二级缓存
2.1 二级缓存简介
二级缓存是全局缓存,默认关闭,需手动配置。它跨 SqlSession
,适用于多个会话共享数据。缓存存储实体类,需实现 Serializable
接口。
2.2 二级缓存配置
- 全局开关:配置
cacheEnabled
为true
,默认开启。 - 缓存标签:在
mapper
文件中使用<cache>
标签,指定要缓存的 SQL。 - 实体类:确保实体类实现
Serializable
。
2.3 二级缓存属性
- 回收策略:默认
LRU
(最近最少使用)。 - 刷新间隔:默认 1 小时,定期清空缓存。
- 最大引用数:设定缓存大小,避免内存溢出。
- 只读模式:可选
readonly
属性,控制缓存可写性。
2.4 二级缓存失效情况
- 增删改操作:触发缓存失效,需设置
flushCache="false"
避免。 - 禁用缓存:通过
useCache="false"
禁用某些查询加入缓存。 - 关联清空:使用
<cache-ref>
关联其他命名空间的缓存清空。
2.5 二级缓存应用场景
- 频率高但频率低的查询:适合时间敏感但稳定数据。
- 分布式环境:结合 Redis 等分布式缓存,提升性能。
总结
MyBatis 的一级和二级缓存均提供了缓存机制,适用于不同场景。一级缓存适合单会话,二级缓存适合多会话。合理配置可提升性能,但需注意数据一致性和脏读问题。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月15日 12时11分52秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C# WPF开源控件库:MahApps.Metro
2019-03-05
使用QT实现一个简单的登陆对话框(纯代码实现C++)
2019-03-05
QT :warning LNK4042: 对象被多次指定;已忽略多余的指定
2019-03-05
GLFW 源码 下载-编译-使用/GLAD配置
2019-03-05
针对单个网站的渗透思路
2019-03-05
Typescript 学习笔记六:接口
2019-03-05
【ASP.NET】ASP.NET中权限验证使用OnAuthorization实现
2019-03-05
02、MySQL—数据库基本操作
2019-03-05
OpenJDK1.8.0 源码解析————HashMap的实现(一)
2019-03-05
MySQL-时区导致的时间前后端不一致
2019-03-05
2021-04-05阅读小笔记:局部性原理
2019-03-05
go语言简单介绍,增强了解
2019-03-05
python file文件操作--内置对象open
2019-03-05
架构师入门:搭建基本的Eureka架构(从项目里抽取)
2019-03-05
MongoDB 快速扫盲贴
2019-03-05
修复搜狗、360等浏览器不识别SameSite=None 引起的单点登录故障
2019-03-05
EXTJS4.2——10.Tab+Iframe
2019-03-05
WEB基础——AJAX
2019-03-05
one + two = 3
2019-03-05