当前位置: 首页 > news >正文

为什么很多公司禁用 MyBatis 二级缓存?看完你就不敢乱开了

为什么很多公司禁用 MyBatis 二级缓存?看完你就不敢乱开了


先说结论:MyBatis 二级缓存默认并不会生效,必须显式配置 。但即使如此,很多公司仍然选择禁用它,因为缓存一致性问题远比性能问题更难处理。
很多人学 MyBatis 的时候都会看到这样一个功能:
<cache/>

官方文档告诉你:

开启之后,查询结果会缓存,下次直接从缓存读取,减少数据库压力。

听起来是不是很美好?但现实却是:很多公司的 MyBatis 配置里根本不开二级缓存,甚至架构规范明确规定:

禁止使用 MyBatis 二级缓存

为什么?既然官方提供了这个功能。为什么大厂反而不用?

今天我们从源码和实际项目角度聊清楚。


一级缓存和二级缓存到底是什么

很多人先把这两个概念搞混了。

一级缓存

作用范围:

SqlSession

例如:

Useruser1=mapper.selectById(1);Useruser2=mapper.selectById(1);

同一个 SqlSession。

只会查询一次数据库,第二次直接走缓存。

缓存位置:

BaseExecutor

源码:

protectedPerpetualCachelocalCache;

结构:

SqlSession ↓ localCache ↓ 查询结果

一级缓存默认开启,而且基本没有风险。


二级缓存

作用范围:

Mapper级别

例如:

UserMapper

多个 SqlSession 共享。

配置:

<cache/>

开启后:

SqlSession1 ↓ UserMapper Cache ↑ SqlSession2

所有会话共享同一份缓存。

问题也从这里开始。


二级缓存最大的坑:数据不一致

假设:

数据库:

id=1 name=张三

第一次查询:

selectById(1)

结果进入缓存。

缓存:

id=1 name=张三

此时另一个系统修改数据:

updateusersetname='李四'whereid=1;

数据库:

李四

缓存:

张三

这时候:

selectById(1)

读到的还是:

张三

脏数据出现了。


为什么互联网项目特别怕这个

假设是用户余额:

数据库 1000

缓存:

1000

扣款后:

数据库 800

缓存:

1000

用户再次查询:

余额1000

直接出事故。

所以涉及:

  • 用户余额
  • 库存
  • 订单
  • 权限

这种数据。

根本不允许出现缓存脏读。


MyBatis 根本不知道谁修改了数据库

这是最核心的问题。

很多人觉得:

更新时清缓存不就行了?

理论上没错,实际上做不到。

因为系统越来越大后:

服务A 服务B 服务C

都可能操作同一张表。

例如:

订单服务 营销服务 后台管理系统 数据同步程序

都能更新数据库。

MyBatis 二级缓存只能感知:

自己执行的更新

却不知道:

别人执行的更新

所以缓存很容易失效。


集群环境更加危险

单机还勉强能玩,集群直接出问题。

例如:

服务器A 服务器B 服务器C

每台机器:

自己的JVM 自己的缓存

结构:

A缓存 B缓存 C缓存

互相不知道。


用户访问:

请求1 → A

缓存:

张三

然后:

请求2 → B

数据库已经变成:

李四

结果:

A返回张三 B返回李四

同一个用户,两次查询结果不一样。


二级缓存本质是 JVM 本地缓存

源码:

PerpetualCache

内部结构:

privatefinalMap<Object,Object>cache;

其实就是:

HashMap

没错,就是 JVM 内存里的一个 Map,所以:

无法跨机器同步

天然不适合集群。


事务提交后才写入缓存

很多人不知道这个细节。

查询完成:

selectById()

并不会立刻进入二级缓存。

源码:

TransactionalCache

提交事务:

sqlSession.commit()

才会:

flushPendingEntries()

写入缓存。

原因很简单:避免事务回滚导致缓存脏数据。


看起来很聪明,但效率反而下降

查询流程:

查询 ↓ 一级缓存 ↓ 二级缓存 ↓ 数据库

每次都要检查缓存、每次都要序列化、每次都要维护缓存状态。

如果命中率不高:

缓存收益 < 维护成本

反而变慢。


更致命的问题:对象序列化

开启二级缓存后:

实体通常要求:

implementsSerializable

例如:

publicclassUserimplementsSerializable{}

原因:缓存对象可能需要序列化,否则直接报错,很多老项目都踩过这个坑。


现在大家都用什么替代

答案:

Redis

架构变成:

应用 ↓ Redis ↓ MySQL

优势:

统一缓存

所有机器共享:

Redis

不存在:

A机器缓存 B机器缓存

问题。


可以主动失效

更新数据:

updateUser();redis.del(key);

立即失效,比 MyBatis 二级缓存可靠得多。


可以设置过期时间

TTL=30分钟

即使忘记删除,也不会长期脏数据。


支持分布式

Redis 天然支持:

多节点 集群 哨兵 主从

远比本地缓存成熟。


那二级缓存还有价值吗

有。但适用场景非常少。

例如:

基础配置表

省份表 城市表 字典表 菜单配置

特点:

读多写少 几乎不更新

这种场景比较适合。


单体项目

没有集群,没有微服务,只有一台机器,这种情况也能使用。


为什么大厂普遍禁用

真正原因其实只有一句话:

缓存失效比缓存命中难一万倍。

MyBatis 二级缓存:

解决的是:

查询性能

带来的却是:

数据一致性风险

而对于互联网系统来说:

错误的数据 比 慢一点的数据 更可怕

所以大多数公司的选择都是:

一级缓存保留 二级缓存关闭 Redis统一管理缓存

总结

MyBatis 二级缓存并不是没用,而是不适合现代互联网架构。

核心问题:

本地缓存 无法跨服务同步 容易出现脏数据

源码核心类:

PerpetualCacheTransactionalCacheCachingExecutor

缓存流程:

一级缓存(SqlSession) ↓ 二级缓存(Mapper) ↓ 数据库

所以你会发现:很多公司不是不会用二级缓存,而是了解原理之后,主动选择关闭。


上篇文章:

《MyBatis 插件为什么这么强大?一次看懂拦截器机制》

下篇文章:

《MyBatis 到底解决了什么问题?》

http://www.jsqmd.com/news/1069512/

相关文章:

  • Python 3正则表达式完全指南:从入门到精通
  • 基于 Harmony 6.0 应用的游戏时长统计与防沉迷提醒应用首页实现
  • 金融事件序列建模:PRAGMA Transformer模型解析与应用
  • 2026 AI 开发者生存指南(5):AI Agent 框架对比——LangChain、LangGraph、CrewAI、Dify 怎么选?
  • Tiny Time Mixers (TTMs): Fast Pre-trained Models for Enhanced Zero/Few-Shot Forecasting of Multivari
  • 基于LLM的文本相关性评估:从RAG优化到可持续性分析的工程实践
  • Spring AI 接入 MCP:DeepSeek 连接 Filesystem Server 读取本地文件
  • 复杂流体系统实时控制:模型降阶与滚动时域优化实践
  • DINOv3+LoRA:基于视觉基础模型的图像篡改检测新范式
  • 当AI Agent开始写AI Agent:自进化系统在企业管理中的伦理与安全红线
  • MatRIS-MoE与Janus框架:突破百亿参数通用机器学习原子间势训练壁垒
  • 指纹浏览器指纹工厂(下):基于真实设备数据特征的马尔可夫链生成与校验
  • 广告物料行业实践指南:从制作到落地的全流程解析与未来趋势展望
  • 基于SRAM存内计算的Transformer Softmax硬件加速方案解析
  • 自适应信息流:让视觉语言模型学会动态聚焦的关键技术
  • 小旺 AI 截图:基于多模态大模型的桌面效率工具
  • 大语言模型对齐中的奖励破解问题与CARP框架解析
  • Shell脚本为何成为AI智能体视觉(TVA)的“反射弧”(6)
  • 专利代理师:2025年实务真题回忆版
  • 【趣解】压力测试:极限情况下的系统表现
  • 暗黑模式下的WCAG合规性:从颜色对比度到欺骗性设计的全面解析
  • 当AI吞噬肌肉记忆:我们该缴械投降,还是做冷酷的“混合智能体”?
  • Codex和cc Switch的安装以及使用DeepSeek大模型
  • 范畴论与多项式映射:从微分模态中提取N-过滤结构的原理与实践
  • Windows Codex + CC Switch+deepseek 完整闭坑配置指南
  • AI评估准则:从博弈论到机制设计的20条实战原则
  • Redis Cluster 的重试逻辑
  • AestheticNet:融合视觉认知与语义感知的图像美学质量评估新范式
  • 博弈论与机制设计:构建AI系统评估的20条核心原则与实践指南
  • CentOS初始服务器安全配置:firewalld、sudo与SSH密钥实战指南