MyBatis缓存mybatis缓存原理
作为一名Java开发工程师,面试时经常被问到MyBatis缓存原理。今天我们就结合真实面试场景,用大白话聊聊MyBatis缓存的设计逻辑。
👉 2025年Java面试宝典:点击下载(提取码:9b3g)
MyBatis缓存是什么?
简单说,MyBatis缓存就是给数据库查询加了个"备忘录"。当重复查询相同数据时,直接从内存拿结果,避免反复访问数据库。这分为两层:一级缓存和二级缓存。

一级缓存原理
一级缓存是SqlSession级别的缓存:
- 默认开启:同一个SqlSession内,执行相同SQL+参数时,直接返回缓存结果
- 生命周期:随SqlSession创建而创建,关闭时销毁
- 失效场景:
- 执行了增删改操作(自动清空缓存)
- 调用
sqlSession.clearCache()手动清空 - 查询时强制刷新缓存(
flushCache=true)
面试官常问:"为什么我连续查两次,第二次没走缓存?" 大概率是两次查询用了不同SqlSession!
二级缓存原理
二级缓存是Mapper级别的缓存:
- 跨SqlSession共享:多个SqlSession访问同一Mapper时命中缓存
- 开启条件:
<!-- 在mybatis-config.xml中全局启用 --> <settings> <setting name="cacheEnabled" value="true"/> </settings><!-- 在Mapper.xml中声明使用缓存 --> <cache/> - 工作流程:
- 查询时先查二级缓存
- 未命中则查一级缓存
- 两级缓存都没有才查数据库
- 序列化要求:缓存对象必须实现
Serializable接口

缓存避坑指南
- 脏读问题:二级缓存跨Session共享,当其他Session更新数据时,缓存不会自动更新(需配置
flushCache="true") - 分布式陷阱:单机二级缓存用HashMap实现,分布式环境需集成Redis等第三方缓存
- 事务隔离性:一级缓存可能导致"不可重复读",建议事务中禁用缓存
面试高频问题
-
Q:一级缓存和二级缓存的区别?
A:一级缓存作用域是SqlSession,二级缓存作用域是Mapper namespace;一级缓存默认开启,二级缓存需手动配置 -
Q:如何避免缓存导致的数据不一致?
A:关键业务场景可关闭二级缓存,或通过<cache-ref>指定缓存同步策略 -
Q:哪些场景不适合用缓存?
A:实时性要求高的数据(如支付状态)、高频更新的数据

💡 小贴士:想刷更多MyBatis缓存真题?可到面试鸭返利网获取最新题库。购买面试鸭会员时,通过该站联系我可返利25元!
理解mybatis缓存原理的核心,就是把握"空间换时间"的设计思想。合理利用缓存,能让应用性能提升数倍,但用错场景反而会导致灾难性后果。建议结合业务特点,针对性选择缓存策略。
👉 更多Java面试技巧:欢迎访问面试鸭返利网


