MyBatis 中怎么配置一级缓存与二级缓存及避坑指南

老婷吖_8099

老婷吖_8099

2026-08-11

1036人浏览

原创

MyBatis一级缓存默认开启、绑定SqlSession,二级缓存需全局配置+Mapper声明+实体序列化;二者均易引发脏读,尤其在多会话、高并发或关联查询场景下。

mybatis 中怎么配置一级缓存与二级缓存及避坑指南

MyBatis 的一级缓存默认开启、无需配置,二级缓存需显式启用且有多个前提条件。用错或忽略细节容易引发脏读、数据不一致等问题,尤其在多会话、高并发或关联查询场景下。

一级缓存:默认生效,但要注意它的“边界”

一级缓存绑定 SqlSession 实例,本质是 BaseExecutor 内部的 PerpetualCache(底层为 HashMap),同一 SqlSession 中重复执行完全相同的 select 语句会直接命中缓存。

  • 缓存 Key 由五部分组成:Mapper 全限定名 + SQL 语句 + 参数值 + 分页 offset/limit + 环境 ID —— 任一变化都会导致未命中
  • 只要执行过 insert/update/delete(哪怕操作的是其他表),当前 SqlSession 的一级缓存立即清空
  • 调用 sqlSession.clearCache() 或 sqlSession.close() / commit() / rollback() 都会销毁缓存
  • 注意线程安全:SqlSession 不是线程安全的,通常靠 Spring 的 SqlSessionTemplate 或 ThreadLocal 管理,避免跨线程共享同一个 SqlSession

二级缓存:三步启用,缺一不可

二级缓存作用域是 Mapper 的 namespace,跨 SqlSession 共享,但必须满足三个硬性条件才能真正生效:

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载
  • 全局开关打开:在 mybatis-config.xml 或 application.yml 中启用

    或 Spring Boot 中:
    mybatis: configuration: cache-enabled: true
  • Mapper XML 中声明 :放在 mapper 标签内部,可配置参数如 eviction、size、flushInterval、readOnly
  • 查询返回的实体类实现 Serializable 接口:否则启动时抛异常,因为二级缓存需序列化存储(即使是本地缓存)

常见坑点与避坑建议

二级缓存看似简单,但实际踩坑率极高,核心问题集中在数据一致性上:

  • 写操作自动清空缓存,但仅限本 Mapper namespace:比如 ProductMapper 执行了 update,只会清 ProductMapper 的缓存,不会影响 OrderMapper 中关联查出的 product 数据 → 建议对关联查询统一使用 cache-ref 或禁用二级缓存
  • readOnly="false" 要慎用:设为 false 时 MyBatis 返回缓存对象的拷贝,但深拷贝逻辑依赖 Serializable,若对象含非序列化字段或循环引用,可能失败或性能陡降;推荐设为 true,返回只读对象,性能更好
  • 不要缓存实时性要求高的数据:如用户余额、订单状态、库存数量等,应走数据库直查或搭配 Redis 做分布式缓存+主动失效
  • Spring 事务内多次查询可能“看似没走缓存”:因事务中 SqlSession 通常复用,一级缓存仍有效;但二级缓存只有在事务提交后才写入,未提交前其他会话查不到最新结果

什么时候该关掉缓存?

不是所有场景都适合开缓存。以下情况建议关闭二级缓存,或一级缓存也谨慎使用:

  • 高频更新的表(如日志表、消息表、订单明细)
  • 涉及复杂动态 SQL(where 条件组合极多,缓存命中率趋近于 0)
  • 单次查询耗时极短(
  • 微服务集群部署且未集成 Redis/EhCache 等分布式缓存 → 各节点二级缓存不同步,必然数据不一致

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mybatis一级缓存和二级缓存
mybatis一级缓存和二级缓存

在MyBatis中,一级缓存和二级缓存是两种不同级别的缓存机制,它们都可以用来提高性能。本专题提供mybatis一级缓存和二级缓存相关文章,大家可以免费阅读。

2023.08.21

603

4

ibatis和mybatis有什么区别
ibatis和mybatis有什么区别

ibatis和mybatis的区别:1、基本信息不同;2、开发时间不同;3、功能与易用性;4、配置文件;5、入参类型与出参类型;6、返回结果集接受方式;7、语法差异;8、数据库方言支持;9、插件支持;10、社区活跃度;11、全球化支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

3002

5

mybatis如何配置数据库连接
mybatis如何配置数据库连接

mybatis配置数据库连接的方法:1、指定数据源;2、配置事务管理器;3、配置类型处理器和映射器;4、使用环境元素;5、配置别名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

446

5

mybatis工作原理及流程是什么
mybatis工作原理及流程是什么

mybatis工作原理及流程:1、配置文件;2、接口与映射;3、sql解析与生成;4、执行计划;5、结果处理;6、动态sql;7、缓存机制;8、插件;9、事务管理;10、日志与监控;11、扩展性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

292

4

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

302

5

Java MyBatis框架
Java MyBatis框架

本专题专注于Java主流ORM框架MyBatis的应用,系统讲解SQL映射、动态SQL、结果映射、分页查询、缓存机制与多表关联等核心内容,并结合企业管理系统、电商平台和后台管理项目实战,帮助学员全面掌握高效的数据库持久层开发技能。

2025.08.26

6429

22

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

0

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

0

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

20

10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习