大家好,我是锋哥。今天分享关于【讲讲Mybatis的一级、二级缓存?】**面试题。**希望对大家有帮助;
讲讲Mybatis的一级、二级缓存?
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 采用了基于一定规则的缓存清理机制,通常当执行
insert、update、delete操作时,二级缓存会被清空。
2.5 适用场景
- 二级缓存适用于跨多个
SqlSession需要共享数据的场景。例如,查询结果不经常变化的大数据量的查询,可以缓存起来,减少对数据库的访问。
3. 一级缓存与二级缓存的区别
| 特性 | 一级缓存 | 二级缓存 |
|---|---|---|
| 作用范围 | 仅限于当前 SqlSession 内部 |
跨多个 SqlSession,共享同一 Mapper 的缓存 |
| 生命周期 | SqlSession 生命周期内有效 |
存活于整个 MyBatis 应用,直到缓存被清空或失效 |
| 缓存粒度 | SqlSession 对象级别缓存 |
Mapper 级别缓存 |
| 启用方式 | 自动启用 | 需要显式配置启用 |
| 缓存清除 | SqlSession 提交、关闭时清空 |
操作(如 insert、update、delete)时清空 |
| 存储内容 | 存储查询结果,且仅限于该会话的查询 | 存储查询结果,可跨 SqlSession 使用 |
4. 缓存清理机制
- 一级缓存清理 :一级缓存的数据会随着
SqlSession的提交、回滚或者关闭而被清理。 - 二级缓存清理 :二级缓存的数据会受到以下情况的影响:
- 执行增删改操作时,MyBatis 会根据默认的规则(如:
flushCache配置)清空相关的二级缓存。 - 可以通过
flushCache标签手动配置清空缓存的时机。
- 执行增删改操作时,MyBatis 会根据默认的规则(如:
总结
- 一级缓存 :是 MyBatis 默认启用的缓存,作用范围仅限于当前的
SqlSession,适用于在同一会话中多次执行相同查询的情况。 - 二级缓存 :是 MyBatis 支持的跨会话的缓存,作用范围是
Mapper级别,可以在多个SqlSession之间共享缓存数据,适用于需要频繁查询且跨会话共享的数据。
理解并合理使用 MyBatis 的缓存机制,可以有效减少数据库的访问,提高应用性能。
