MyBatis的一级、二级缓存

MyBatis 提供了两级缓存机制,即一级缓存和二级缓存,用于提高查询效率,减少数据库访问次数。

一级缓存(Session Cache)

一级缓存是 MyBatis 的默认缓存,它是基于 SQL Session 的缓存。在同一个 SQL Session 中,执行相同的查询语句,MyBatis 会将第一次查询结果缓存起来,后续的查询将直接从缓存中获取数据,而不会再次执行数据库查询。

一级缓存的工作原理 :
缓存作用域:一级缓存的作用域是同一个 SQL Session。这意味着一旦 SQL Session 关闭,缓存就会被清空。
缓存存储:一级缓存的数据存储在 PerpetualCache 类的一个 HashMap 中,它是基于内存的。
缓存命中:当执行查询时,MyBatis 会先检查一级缓存中是否有相同查询的结果。如果有,则直接返回缓存数据;如果没有,则执行数据库查询,并将结果存入缓存。
缓存失效:任何更新操作(INSERT、UPDATE、DELETE)都会导致一级缓存被清空,因为数据可能已发生变化。

一级缓存的配置 :
++一级缓存默认是开启的,不需要额外配置。++ 但是,可以通过以下方式来控制它。

在 MyBatis 配置文件中设置 <settings> 元素的 localCacheScope 属性,可以设置为 SESSION(默认)或 STATEMENT。如果设置为 STATEMENT,则每次执行完一个 SQL 语句后,缓存就会被清空。

二级缓存(Global Cache)

二级缓存是跨多个 SQL Session 的缓存,它的工作原理类似于一级缓存,但是其作用域是全局的,可以被多个 SQL Session 共享。
二级缓存的工作原理 :
缓存作用域:二级缓存的作用域是同一个 namespace,即同一个 Mapper 映射文件。
缓存存储:二级缓存默认使用 PerpetualCache,但可以通过实现 Cache 接口来使用不同的缓存实现,如 Ehcache、Redis 等。

缓存命中:当执行查询时,MyBatis 会先检查一级缓存,如果未命中,再检查二级缓存。如果二级缓存中有数据,则直接返回;如果没有,则执行数据库查询,并将结果存入二级缓存。
缓存失效:与一级缓存类似,任何更新操作都会导致二级缓存失效。

二级缓存的配置:

++要启用二级缓存,需要进行以下配置++ :

在 MyBatis 配置文件中设置 <settings> 元素的 cacheEnabled 属性为 true(默认为 true)。

在需要使用二级缓存的 Mapper 映射文件中添加 <cache> 元素。

在需要被缓存的查询语句上添加 useCache="true" 属性。

对于需要缓存的对象,该对象类必须实现 java.io.Serializable 接口,以便能够序列化到缓存中。
注意事项 :

二级缓存的数据在不同 SQL Session 之间共享,因此需要谨慎处理并发问题。

在分布式环境下,使用二级缓存可能会遇到数据一致性问题。

通过合理使用一级和二级缓存,可以显著提高 MyBatis 的查询性能,尤其是在大量读操作的场景下。然而,缓存也增加了系统的复杂性,因此在设计和使用时需要权衡其利弊。

相关推荐
非优秀程序员7 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻7 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
沐晓时光8 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
文丑颜不良啊9 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang11 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪11 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息11 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼12 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff13 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff13 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc