讲讲Mybatis的一级、二级缓存?

大家好,我是锋哥。今天分享关于【讲讲Mybatis的一级、二级缓存?】**面试题。**希望对大家有帮助;

讲讲Mybatis的一级、二级缓存?

超硬核AI学习资料,现在永久免费了!

MyBatis 的缓存机制分为 一级缓存二级缓存,它们分别适用于不同的作用域和使用场景。下面将详细讲解这两种缓存的原理和区别。

1. 一级缓存(Local Cache)

1.1 作用范围
  • 一级缓存是 MyBatis 内部默认启用的缓存,它的作用范围是 SqlSession
  • 每个 SqlSession 对象都有独立的一级缓存,当我们执行查询操作时,MyBatis 会首先查找当前 SqlSession 的缓存。如果缓存中已有查询结果,则直接返回,不会再发起 SQL 查询。
  • 一级缓存是基于 SqlSession 的生命周期存在的,在 SqlSession 被关闭或提交后,一级缓存中的数据会被清空。
1.2 工作原理
  • 当执行一个查询时,MyBatis 会先检查当前 SqlSession 的缓存是否有对应的结果。如果有,直接从缓存中获取数据;如果没有,则执行 SQL 查询,并将查询结果存入缓存。
  • 一级缓存会缓存查询时的 原始数据 ,即查询的结果集(包括参数、执行的 SQL 等信息)。如果使用相同的 SqlSession 执行相同的查询,则缓存中的数据会被复用。
1.3 特点
  • 自动开启:一级缓存是 MyBatis 默认开启的,无需额外配置。
  • 作用范围局限 :一级缓存只在同一个 SqlSession 中有效。当 SqlSession 被关闭时,一级缓存会被清空。
  • 数据隔离性 :不同的 SqlSession 之间的一级缓存是独立的,不共享数据。
1.4 适用场景
  • 一级缓存非常适合于需要频繁查询且在一个会话内多次使用的数据。比如在同一事务中进行多次相同的查询操作。

2. 二级缓存(Global Cache)

2.1 作用范围
  • 二级缓存是跨 SqlSession 的缓存,适用于多个 SqlSession 共享的数据。
  • 二级缓存的作用范围是整个 Mapper(映射器) ,即同一个 Mapper 下的所有 SqlSession 可以共享缓存数据。
2.2 工作原理
  • 与一级缓存类似,二级缓存也会存储查询结果。当执行查询操作时,MyBatis 会先检查二级缓存中是否有数据。如果有,就直接从缓存中获取;如果没有,则查询数据库,并将结果存入二级缓存。
  • 二级缓存通常会缓存 查询的结果集 ,而且与一级缓存不同,二级缓存是跨会话的,多个 SqlSession 在同一个 Mapper 中可以共享缓存。
2.3 配置
  • 二级缓存需要通过配置来启用,并且通常需要在 mybatis-config.xml 中配置:

    复制代码
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    
    <mappers>
        <mapper resource="com/example/mapper/SomeMapper.xml">
            <cache/>
        </mapper>
    </mappers>

    其中 <cache/> 标签表示启用该 Mapper 的二级缓存。

2.4 特点
  • SqlSession :二级缓存是跨会话的,在多个 SqlSession 之间共享数据。
  • 需要手动配置:与一级缓存不同,二级缓存需要显式启用并配置。
  • 支持自定义缓存机制:MyBatis 支持多种缓存实现(如:内存缓存、持久化缓存),并允许开发者自定义缓存实现类。
  • 缓存清理 :MyBatis 采用了基于一定规则的缓存清理机制,通常当执行 insertupdatedelete 操作时,二级缓存会被清空。
2.5 适用场景
  • 二级缓存适用于跨多个 SqlSession 需要共享数据的场景。例如,查询结果不经常变化的大数据量的查询,可以缓存起来,减少对数据库的访问。

3. 一级缓存与二级缓存的区别

特性 一级缓存 二级缓存
作用范围 仅限于当前 SqlSession 内部 跨多个 SqlSession,共享同一 Mapper 的缓存
生命周期 SqlSession 生命周期内有效 存活于整个 MyBatis 应用,直到缓存被清空或失效
缓存粒度 SqlSession 对象级别缓存 Mapper 级别缓存
启用方式 自动启用 需要显式配置启用
缓存清除 SqlSession 提交、关闭时清空 操作(如 insertupdatedelete)时清空
存储内容 存储查询结果,且仅限于该会话的查询 存储查询结果,可跨 SqlSession 使用

4. 缓存清理机制

  • 一级缓存清理 :一级缓存的数据会随着 SqlSession 的提交、回滚或者关闭而被清理。
  • 二级缓存清理 :二级缓存的数据会受到以下情况的影响:
    • 执行增删改操作时,MyBatis 会根据默认的规则(如:flushCache 配置)清空相关的二级缓存。
    • 可以通过 flushCache 标签手动配置清空缓存的时机。

总结

  • 一级缓存 :是 MyBatis 默认启用的缓存,作用范围仅限于当前的 SqlSession,适用于在同一会话中多次执行相同查询的情况。
  • 二级缓存 :是 MyBatis 支持的跨会话的缓存,作用范围是 Mapper 级别,可以在多个 SqlSession 之间共享缓存数据,适用于需要频繁查询且跨会话共享的数据。

理解并合理使用 MyBatis 的缓存机制,可以有效减少数据库的访问,提高应用性能。

相关推荐
ComplexPy1 小时前
ZKMall-B2B2C Redission延时队列
java·redis
q***96581 小时前
深入解析Spring Boot中的@ConfigurationProperties注解
java·spring boot·后端
e***87701 小时前
记录 idea 启动 tomcat 控制台输出乱码问题解决
java·tomcat·intellij-idea
发现你走远了1 小时前
2025 idea 指定配置环境运行springboot 设置active和env启动端口,多端口启动 (保姆级图文)
java·spring boot·intellij-idea
z***I3941 小时前
JavaScript原型链
开发语言·前端·javascript
x***58701 小时前
JavaScript语音识别开发
开发语言·javascript·语音识别
sanggou1 小时前
Java秒杀系统设计与实现
java
小年糕是糕手1 小时前
【C++】C++入门 -- 输入&输出、缺省参数
c语言·开发语言·数据结构·c++·算法·leetcode·排序算法
q***92512 小时前
PHP搭建开发环境(Windows系统)
开发语言·windows·php