您现在的位置是:首页 >技术教程 >MyBatis 缓存机制详解网站首页技术教程
MyBatis 缓存机制详解
简介MyBatis 缓存机制详解
引言
在高并发系统中,数据库查询往往是性能瓶颈之一。为了提高查询效率,减少数据库的访问次数,缓存机制应运而生。MyBatis作为一款优秀的ORM框架,内置了强大的查询缓存特性,支持一级缓存和二级缓存两种缓存机制。
拓展阅读:深入理解 MyBatis 框架的核心对象:SqlSession
一、缓存的作用与分类
缓存(Cache) 是一种临时存储数据的机制,用于加速重复数据的访问。MyBatis 提供两级缓存:
- 一级缓存:默认开启,基于
SqlSession
生命周期。在同一个SqlSession
中执行相同的查询语句时,MyBatis会先查看一级缓存中是否存在之前查询的结果,如果存在则直接从缓存中读取数据,而不会再次发送数据库请求。 - 二级缓存:需手动开启,基于
Mapper
命名空间,跨会话共享。同一个mapper
的多个SqlSession
共享二级缓存。二级缓存需要显式开启和配置。
二、一级缓存:会话级缓存
1. 核心特性
- 作用范围:同一个
SqlSession
内的查询结果会被缓存。 - 自动生效:执行相同的 SQL 和参数时,直接从内存返回结果。
- 生命周期:随
SqlSession
的创建而开启,随其关闭或清空而销毁。
2. 缓存失效场景
- 执行
insert
、update
、delete
操作(任何写操作)。 - 调用
sqlSession.clearCache()
手动清空。 - 配置
flushCache="true"
(如<select flushCache="true">
)。
3. 示例与验证
// 通过SqlSessionFactory创建一个SqlSession对象
// SqlSessionFactory是MyBatis的核心对象,用于创建SqlSession。
// SqlSession是MyBatis中执行命令、获取映器射和管理事务的接口。
SqlSession session = sqlSessionFactory.openSession();
// 通过SqlSession获取UserMapper接口的代理实现对象
// getMapper()方法会根据传入的Mapper接口类型,返回一个代理对象。
// 这个代理对象可以调用Mapper接口中定义的方法来执行SQL语句。
// UserMapper是一个Mapper接口,定义了与用户相关的数据库操作方法。
UserMapper mapper = session.getMapper(UserMapper.class);
// 第一次查询,访问数据库
User user1 = mapper.selectUserById(1);
// 第二次查询同一数据,直接从缓存读取
User user2 = mapper.selectUserById(1);
System.out.println(user1 == user2); // 输出 true
三、二级缓存:跨会话的Mapper级缓存
1. 开启方式
- XML 配置:在 Mapper 文件中添加
<cache/>
标签。 - 注解配置:使用
@CacheNamespace
注解。
<mapper namespace="com.example.UserMapper">
<cache eviction="LRU" flushInterval="60000" size="1024"/>
</mapper>
2. 核心特性
- 作用范围:同一
Mapper
下的所有SqlSession
共享缓存。 - 存储策略:默认实现为
PerpetualCache
,支持通过eviction
属性设置淘汰策略(如 LRU、FIFO)。 - 数据序列化:缓存对象需实现
Serializable
接口。
3. 缓存同步机制
- 写操作(insert/update/delete)会清空对应 Mapper 的二级缓存。
- 可通过
<select useCache="true">
控制是否缓存某查询。
四、缓存配置与优化
1. 常用配置参数
参数 | 说明 | 示例值 |
---|---|---|
eviction | 缓存淘汰策略 | LRU 、FIFO |
flushInterval | 自动刷新时间(毫秒) | 60000 (1分钟) |
size | 最大缓存对象数 | 1024 |
readOnly | 是否只读(性能优化) | true /false |
2. 第三方缓存集成
MyBatis 支持通过 Cache
接口扩展,可集成 Ehcache、Redis 等:
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
五、缓存使用建议
- 适用场景:
- 查询频繁且数据更新少的业务(如配置表)。
- 对实时性要求不高的数据。
- 避坑指南:
- 避免在分布式环境中使用默认二级缓存(需改用集中式缓存如 Redis)。
- 多表关联查询时,需配置
<cache-ref>
避免脏数据。
- 调试技巧:
- 启用 MyBatis 日志(
log4j.logger.org.mybatis=DEBUG
)观察缓存命中情况。
- 启用 MyBatis 日志(
六、总结
MyBatis 的缓存机制通过减少数据库压力显著提升性能,但需权衡数据一致性与性能。合理配置一级与二级缓存,结合业务场景选择合适的策略,才能最大化发挥其优势。对于高频读写场景,建议通过代码设计(如延迟加载)或引入外部缓存系统进一步优化。
拓展阅读:深入理解 MyBatis 框架的核心对象:SqlSession
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。