1. MyBatis缓存机制深度解析
作为一名长期使用MyBatis的开发老兵,我深刻体会到缓存机制对系统性能的关键影响。今天我想和大家分享MyBatis缓存的工作原理、实战技巧以及那些官方文档没有明确说明的"坑"。
MyBatis提供了两级缓存结构:一级缓存(本地缓存)和二级缓存(全局缓存)。这两级缓存在作用域、生命周期和实现机制上都有显著差异。理解这些差异是合理使用缓存的前提。在实际项目中,我曾见过不少因为误用缓存导致的性能问题甚至数据不一致,这些问题往往在系统压力测试或生产环境才会暴露出来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. MyBatis缓存核心机制
2.1 一级缓存:SqlSession级别的缓存
一级缓存是MyBatis默认开启的缓存机制,它的生命周期与SqlSession绑定。当同一个SqlSession中执行相同的SQL查询时,MyBatis会直接从内存返回结果,而不再访问数据库。
实现原理:
- 存储结构:PerpetualCache(使用HashMap实现)
- 作用域:SqlSession级别
- 默认开启:无需配置
典型工作流程:
- 首次查询:执行SQL,结果存入HashMap
- 相同查询:直接从HashMap获取结果
- SqlSession关闭:缓存自动清空
重要提示:一级缓存只在同一个SqlSession内有效,不同的SqlSession即使查询相同数据也会访问数据库。
2.2 二级缓存:Mapper级别的缓存
二级缓存的作用域是Mapper级别,可以被多个SqlSession共享。这意味着不同用户的不同会话可以共享相同的缓存数据。
核心特点:
- 需要显式配置:在mapper.xml中添加
<cache/>标签 - 存储结构:默认使用PerpetualCache,但可替换
- 生命周期:与应用程序相同
- 事务提交后生效:避免脏读
配置示例:
xml复制<mapper namespace="com.example.UserMapper">
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
</mapper>
