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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值