您现在的位置是:首页 >技术教程 >MyBatis 缓存机制详解网站首页技术教程

MyBatis 缓存机制详解

干中学26 2025-09-07 12:01:03
简介MyBatis 缓存机制详解

引言

在高并发系统中,数据库查询往往是性能瓶颈之一。为了提高查询效率,减少数据库的访问次数,缓存机制应运而生。MyBatis作为一款优秀的ORM框架,内置了强大的查询缓存特性,支持一级缓存和二级缓存两种缓存机制。

拓展阅读深入理解 MyBatis 框架的核心对象:SqlSession


一、缓存的作用与分类

缓存(Cache) 是一种临时存储数据的机制,用于加速重复数据的访问。MyBatis 提供两级缓存

  • 一级缓存:默认开启,基于 SqlSession 生命周期。在同一个SqlSession中执行相同的查询语句时,MyBatis会先查看一级缓存中是否存在之前查询的结果,如果存在则直接从缓存中读取数据,而不会再次发送数据库请求。
  • 二级缓存:需手动开启,基于 Mapper 命名空间,跨会话共享。同一个mapper的多个SqlSession共享二级缓存。二级缓存需要显式开启和配置。

二、一级缓存:会话级缓存
1. 核心特性
  • 作用范围:同一个 SqlSession 内的查询结果会被缓存。
  • 自动生效:执行相同的 SQL 和参数时,直接从内存返回结果。
  • 生命周期:随 SqlSession 的创建而开启,随其关闭或清空而销毁。
2. 缓存失效场景
  • 执行 insertupdatedelete 操作(任何写操作)。
  • 调用 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缓存淘汰策略LRUFIFO
flushInterval自动刷新时间(毫秒)60000(1分钟)
size最大缓存对象数1024
readOnly是否只读(性能优化)true/false
2. 第三方缓存集成

MyBatis 支持通过 Cache 接口扩展,可集成 EhcacheRedis 等:

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

五、缓存使用建议
  1. 适用场景
    • 查询频繁且数据更新少的业务(如配置表)。
    • 对实时性要求不高的数据。
  2. 避坑指南
    • 避免在分布式环境中使用默认二级缓存(需改用集中式缓存如 Redis)。
    • 多表关联查询时,需配置 <cache-ref> 避免脏数据。
  3. 调试技巧
    • 启用 MyBatis 日志(log4j.logger.org.mybatis=DEBUG)观察缓存命中情况。

六、总结

MyBatis 的缓存机制通过减少数据库压力显著提升性能,但需权衡数据一致性性能。合理配置一级与二级缓存,结合业务场景选择合适的策略,才能最大化发挥其优势。对于高频读写场景,建议通过代码设计(如延迟加载)或引入外部缓存系统进一步优化。
拓展阅读深入理解 MyBatis 框架的核心对象:SqlSession

在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。