"小崔,缓存不是万能药,是双刃剑。一级缓存默认开着,二级缓存默认关着,知道为什么吗?"——白歌
本章定位
一句话:本章解决"MyBatis如何分层缓存查询结果、各层缓存的作用域和适用场景是什么、如何集成第三方缓存和分页插件"的问题。
飞翔科技的电商大促前,李眉的压测报告显示数据库CPU飙到90%。白歌排查后发现:大量重复查询穿透到数据库,二级缓存没开,自定义缓存也没接。大翔要求:本周内完成缓存策略评审,每一层缓存的开启条件和失效策略必须文档化。这一章,小崔把MyBatis的性能优化武器库全部盘点清楚。
学习路线图
学习顺序说明:
- 先理解默认行为(一级缓存)→ 知道SqlSession级别的缓存是自动开启的,以及它的生命周期和局限
- 再学跨会话共享(二级缓存)→ 理解Mapper级别的缓存如何跨SqlSession共享,以及序列化要求
- 再学精细控制(缓存配置详解)→ 掌握eviction、flushInterval、size、readOnly等参数的含义
- 再看企业级扩展(自定义缓存)→ 集成Redis、Ehcache等分布式缓存,解决集群环境下的缓存一致性问题
- 最后看执行层优化(Executor / 分页插件)→ 理解执行器架构和物理分页的实现原理
文件关系说明
| 文件 | 一句话角色 |
|---|---|
一级缓存.md | 默认缓存层:SqlSession生命周期内有效,默认开启,解决同会话重复查询,但会话关闭即失效 |
二级缓存.md | 跨会话缓存层:Mapper命名空间级别,需显式开启,解决多会话共享,但要求对象可序列化 |
缓存配置详解.md | 调参手册:eviction策略(LRU/LFU/SOFT/WEAK)、刷新间隔、大小限制、只读模式的权衡 |
自定义缓存.md | 企业级扩展:实现Cache接口接入Redis/Ehcache,解决分布式部署下的缓存同步和失效问题 |
Executor执行器类型.md | 执行架构基础:SIMPLE(默认)、REUSE(预编译复用)、BATCH(批量执行)的选择场景 |
分页插件.md | 物理分页方案:PageHelper等插件的拦截原理,以及分页查询与缓存的协同注意事项 |
知识图谱
核心概念关系:
- 一级缓存(Local Cache):绑定在
SqlSession上,默认开启,作用域最小,生命周期最短。适合同一会话内的循环查询或嵌套查询。关闭SqlSession即清空。 - 二级缓存(Namespace Cache):绑定在
Mapper命名空间上,默认关闭,需<cache>或@CacheNamespace显式开启。作用域跨SqlSession,但要求缓存对象实现Serializable。适合读多写少、数据变动不频繁的业务。 - 自定义缓存:实现
org.apache.ibatis.cache.Cache接口,将二级缓存的存储后端替换为Redis、Ehcache、Caffeine等。分布式环境下必须使用自定义缓存,否则多节点二级缓存各自为政,数据不一致。 - Executor执行器:
SIMPLE:每次执行都创建新Statement,最通用REUSE:复用预编译Statement,适合同SqlSession内重复执行相同SQLBATCH:批量执行更新,减少网络往返,适合大批量插入/更新
- 分页插件:通过拦截Executor的query方法,在SQL中注入
LIMIT/OFFSET(或各数据库方言等价物),实现物理分页。分页查询结果通常不走缓存,或需要独立缓存策略。
三层缓存作用域对比:
| 层级 | 作用域 | 默认状态 | 适用场景 | 注意事项 |
|---|---|---|---|---|
| 一级缓存 | SqlSession | 开启 | 同会话重复查询 | 会话关闭即失效,脏读风险低 |
| 二级缓存 | Mapper Namespace | 关闭 | 跨会话读多写少 | 需序列化,写操作会清空缓存 |
| 自定义缓存 | 应用/集群 | 需配置 | 分布式部署、大数据量 | 需处理缓存一致性和失效策略 |
与下一章的衔接
本章是MyBatis核心教程的最后一章。学完后,小崔已经掌握了从快速上手、全局配置、SQL映射、动态SQL、关联查询、注解开发到缓存优化的完整链路。
后续进阶方向:
- Spring/SpringBoot集成:将MyBatis交给Spring管理SqlSessionFactory和事务,实现零XML配置
- 插件开发:基于第02章的plugins机制,开发企业级拦截器(如数据权限、SQL审计、慢查询监控)
- 源码阅读:深入理解MyBatis的Binding模块、Executor架构、Cache装饰器链
"缓存和分页是最后一道门。迈过去,MyBatis的核心你就通关了。剩下的,是在项目里摔打出来的经验。"——白歌