讲讲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 的缓存机制,可以有效减少数据库的访问,提高应用性能。

相关推荐
代码中介商6 分钟前
C++运行时多态深度解析:从原理到实践
开发语言·c++·多态·虚函数
QuZero6 分钟前
Semaphore Principle
java·算法
我登哥MVP15 分钟前
【SpringMVC笔记】 - 8 - 文件上传与下载
java·spring boot·spring·servlet·tomcat·maven
额呃呃16 分钟前
Andriod项目番茄钟
java·开发语言
Via_Neo17 分钟前
不能对方法返回值进行赋值
开发语言·python
梅孔立22 分钟前
Java 基于 POI 模板 Excel 导出工具类 双数据源 + 自动合并单元格 + 自适应行高 完整实战
java·开发语言·excel
代码中介商23 分钟前
C++ 继承与派生深度解析:存储布局、构造析构与高级特性
开发语言·c++·继承·派生
我不是懒洋洋30 分钟前
【经典题目】栈和队列面试题(括号匹配问题、用队列实现栈、设计循环队列、用栈实现队列)
c语言·开发语言·数据结构·算法·leetcode·链表·ecmascript
枫叶丹431 分钟前
【HarmonyOS 6.0】ArkWeb PDF浏览能力增强:指定PDF文档背景色功能详解
开发语言·华为·pdf·harmonyos
谭欣辰33 分钟前
C++ 控制台跑酷小游戏2.0
开发语言·c++·游戏程序