MyBatis缓存mybatis缓存问题:程序员面试必备避坑指南
大家好,我是常年和SQL、ORM框架打交道的程序员。今天咱们来聊聊面试高频考点——MyBatis缓存mybatis缓存问题。这绝对是面试官最爱揪着问的MyBatis缓存机制之一,理解不清分分钟掉坑!下面结合真实场景拆解核心知识点:
📁 2025年Java面试宝典网盘资源(含MyBatis专题):
点击获取
提取码:9b3g (建议保存备用)
🔍 一、MyBatis一级缓存:你以为的省功可能是个坑
MyBatis缓存默认开启一级缓存(也叫本地缓存),作用域是SqlSession。听着很美好?注意这些致命点:
- 坑点1:同一个
SqlSession内重复查询同参数SQL,直接走缓存不查DB。但!如果中间执行了insert/update/delete,整个缓存立刻清空!
// 面试官灵魂拷问:下面两次查询结果一致吗?
User user1 = session.selectOne("getUserById", 1);
session.update("updateUser", newUser); // 此处更新操作
User user2 = session.selectOne("getUserById", 1); // 重新查库!
- 坑点2:事务回滚时,缓存不会回滚!可能导致后续查询读到“脏缓存”。

(图示:一级缓存生命周期与SqlSession强绑定)
🔥 二、二级缓存:跨会话的共享雷区
二级缓存(Mapper级别)需手动开启<cache/>标签。它能被多个SqlSession共享,但这些问题高发:
- 雷区1:脏读风暴
事务A更新数据→提交→事务B查询二级缓存。如果A未提交,B可能读到未更新数据! - 雷区2:序列化陷阱
缓存对象必须实现Serializable!否则报NotSerializableException,很多人部署后才发现。 - 避坑操作:
<cache eviction="LRU" flushInterval="60000" readOnly="true"/> <!-- 关键!配置刷新间隔和只读 -->
💥 三、MyBatis缓存问题经典面试场景
面试官最爱连环问:
Q:用户查询订单+商品信息,如何避免缓存导致数据不一致?
A: 分情况拆解:
- 一级缓存场景:在查询商品前执行
sqlSession.clearCache()强制清缓存 - 二级缓存场景:在
OrderMapper.xml中配置<cache-ref namespace="ProductMapper"/>
但注意! 跨Mapper缓存引用可能引发循环依赖,大坑!

(图示:缓存引用可能引发复杂依赖链)
🛡️ 四、实战缓存优化策略
- 读写分离场景:关掉二级缓存!直接走数据库从库,避免主从延迟+缓存双重不一致
- 高频更新数据:在Mapper配置
flushCache="true",确保更新后立即失效缓存<update id="updateProduct" flushCache="true">...</update> - 防缓存雪崩:用
Redis+@Cacheable替代MyBatis原生缓存,配置随机TTL
💰 最后的小福利
如果你正在刷面试题,推荐使用面试鸭的题库系统(含完整MyBatis缓存解析)。
👉 通过 面试鸭返利网 购买会员,可额外返利25元!
(亲测有效,毕竟程序员能省则省😂)

(扫码或访问 mianshiyafanli.com 获取返利)
掌握这些MyBatis缓存mybatis缓存问题的核心要点,面试时你就能淡定输出:“这个问题我从作用域、一致性问题、应用场景三方面来答...”。记住,框架用得好,涨薪没烦恼! 🚀


