0

0

MyBatis一级二级缓存是什么 MyBatis缓存机制详解【分析】

月夜之吻

月夜之吻

发布时间:2025-12-20 01:49:34

|

327人浏览过

|

来源于php中文网

原创

MyBatis一级缓存是SqlSession级私有缓存,默认开启,同会话内重复查询直接返回缓存,执行DML即清空;二级缓存是Mapper级共享缓存,需手动配置,commit后写入,DML操作清空对应namespace全部缓存。

mybatis一级二级缓存是什么 mybatis缓存机制详解【分析】

MyBatis 一级缓存和二级缓存,是它内置的两层本地缓存机制,核心目标很实在:减少重复 SQL 查询、降低数据库压力、提升读取性能。它们不是可有可无的附加功能,而是影响数据一致性与系统行为的关键设计点,用对了提效,用错了容易出脏数据。

一级缓存:SqlSession 级别的“私有小本本”

一级缓存默认开启,无需配置,作用域严格限定在**同一个 SqlSession 实例内**。它底层是一个 PerpetualCache(本质是 HashMap),由 SqlSession 内部的 Executor 持有。

  • 同一次 SqlSession 中执行两次完全相同的查询(SQL + 参数 + 环境一致),第一次查库并写入缓存,第二次直接返回缓存结果
  • 只要在该 SqlSession 中执行过任意 insert/update/delete 操作,不管是否 commit,整个一级缓存都会被清空
  • 不同 SqlSession 之间互不共享,哪怕查的是同一张表、同一个 ID,也各自维护独立缓存
  • 常见陷阱:事务未提交时,另一个线程用新 SqlSession 查询,看到的仍是旧数据——因为一级缓存不跨会话,也不感知外部变更

二级缓存:Mapper 级别的“公共公告栏”

二级缓存作用域是 **Mapper 的 namespace**,多个 SqlSession 可以共享同一份缓存数据,但需要手动开启,且有明确前提条件。

  • 必须在 MyBatis 全局配置中启用:
  • 必须在对应 Mapper XML 文件中添加
  • 所查实体类必须实现 Serializable 接口(因缓存需序列化存储)
  • 只有在 SqlSession 调用 close()commit() 后,查询结果才会真正写入二级缓存;未提交的查询不参与二级缓存写入
  • 同 namespace 下任意增删改操作,会清空该 namespace 对应的整个二级缓存区域

缓存查询顺序与失效逻辑

当一个查询发起时,MyBatis 的实际查找路径是:先查二级缓存 → 再查一级缓存 → 最后查数据库。写入则相反:结果先存一级缓存,commit/close 后再同步到二级缓存。

百度智能云·曦灵
百度智能云·曦灵

百度旗下的AI数字人平台

下载
  • 缓存 key 由多要素构成:MappedStatement ID + SQL 语句 + 参数值 + 分页参数 + 环境 ID,确保精准命中
  • 所有 DML 操作(insert/update/delete)都会触发对应 namespace 的缓存失效,但不会影响其他 namespace
  • 一级缓存失效是“全清”,二级缓存失效也是“全清”,不支持按 key 精细剔除(除非自定义 Cache 实现)

什么时候该用、不该用?

缓存不是银弹。适合缓存的数据通常具备这些特征:读多写少、实时性要求不高、变更影响范围可控。

  • 适合:省市区字典表、状态码枚举、配置项、用户基本信息(如昵称、头像 URL)
  • 慎用:账户余额、库存数量、订单状态、涉及强一致性的业务场景
  • 禁用:高并发写频繁的表、存在跨服务更新的表(二级缓存无法感知外部变更)
  • 分布式环境下建议用 Redis 等第三方缓存替代二级缓存,避免节点间数据不一致

基本上就这些。缓存机制不复杂,但细节决定成败——尤其是失效时机和作用域边界,稍不注意就会埋下数据不一致的隐患。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

676

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

675

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

571

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

414

2024.04.29

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号