全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页

缓存机制专题测试

15 题 45 分钟 难度:

考察知识点

  • 一级缓存机制:SqlSession 级别缓存的作用域、生命周期、失效场景
  • 二级缓存配置:全局开关与 Mapper 级配置、缓存淘汰策略、实体序列化要求
  • 缓存读写策略:只读/读写模式的区别与适用场景、缓存刷新间隔与大小限制
  • 自定义缓存实现:Cache 接口规范、装饰器模式、Redis 分布式缓存集成要点
  • 缓存脏数据处理:多 Mapper 共享表场景、分布式环境一致性、外部数据变更感知
1
单选题

关于 MyBatis 一级缓存的描述,以下哪项是错误的?

A

一级缓存是 SqlSession 级别的缓存,默认开启

B

同一个 SqlSession 中执行相同的 SQL 查询时,会直接从缓存中获取数据

C

当执行 insert、update、delete 操作时,一级缓存会被清空

D

一级缓存可以在多个 SqlSession 之间共享数据

2
填空题

以下哪些操作会导致 MyBatis 一级缓存失效?请填空:

  1. 执行 sqlSession.!!1_!!() 方法会清空一级缓存
  2. 执行 sqlSession.!!2_!!() 方法会清空一级缓存
  3. 手动调用 sqlSession.!!3_!!() 方法可以清空一级缓存
  4. 关闭 sqlSession.!!4_!!() 会销毁一级缓存
3
多选题

关于 MyBatis 二级缓存的配置,以下哪些说法是正确的?

A

需要在 MyBatis 全局配置文件中设置 cacheEnabled=true

B

只需要在 Mapper XML 文件中添加 标签即可

C

实体类必须实现 Serializable 接口

D

二级缓存默认使用 LRU 淘汰策略

4
单选题

在 MyBatis 的 Mapper XML 中,<cache/> 标签的 eviction 属性不支持以下哪种策略?

A

LRU

B

FIFO

C

RANDOM

D

MRU

5
多选题

关于 MyBatis 二级缓存的读写策略,以下哪些说法是正确的?

A

默认情况下,查询结果会以只读方式放入二级缓存

B

设置 readOnly="true" 时,所有调用者共享同一个缓存对象实例

C

设置 readOnly="false" 时,每次获取缓存都会返回对象的序列化副本

D

flushInterval 属性可以设置缓存的自动刷新时间间隔,单位是秒

6
填空题

在 MyBatis Mapper XML 的 <cache> 标签中,以下属性用于控制缓存刷新策略:

  1. !!1_!! 属性设置缓存对象的最大数量,超过此数量后按 eviction 策略淘汰
  2. !!2_!! 属性设置缓存自动刷新的时间间隔(毫秒),默认不自动刷新
  3. 如果希望某个 SELECT 语句不使用二级缓存,可在 <select> 标签上设置 !!3_!!="true"
  4. 如果希望某个 UPDATE 语句执行后不清空二级缓存,可在 <update> 标签上设置 !!4_!!="false"
7
简答题

请解释 MyBatis 二级缓存中 readOnly="true"readOnly="false" 两种模式的区别,并说明在什么场景下应该使用哪种模式?

8
多选题

如果要为 MyBatis 实现自定义的二级缓存(例如使用 Redis),需要实现 org.apache.ibatis.cache.Cache 接口。以下哪些方法是该接口必须实现的?

A

getId()

B

putObject(Object key, Object value)

C

getObject(Object key)

D

removeObject(Object key)

E

clear()

F

getSize()

9
填空题

在 MyBatis 中使用自定义缓存实现时:

  1. 在 Mapper XML 中通过 <cache type="!!1_!!"/> 指定自定义缓存类的全限定名
  2. MyBatis 内置的缓存装饰器 !!2_!! 可以为缓存添加 LRU 淘汰策略
  3. MyBatis 内置的缓存装饰器 !!3_!! 可以为缓存设置定时刷新功能
  4. 如果需要实现分布式缓存,通常推荐基于 !!4_!! 接口进行扩展
10
简答题

如果要将 MyBatis 的二级缓存从默认的 PerpetualCache 替换为 Redis 分布式缓存,请简述需要考虑的关键设计点。

11
多选题

以下哪些操作可能导致 MyBatis 二级缓存出现脏数据?

A

两个不同的 Mapper 操作同一张数据库表,且都开启了二级缓存

B

在事务中执行 update 后未提交就查询,使用了二级缓存

C

手动调用 sqlSession.clearCache() 清空了一级缓存

D

两个 Mapper XML 的 <cache> 标签使用了相同的 namespace

12
填空题

为了防止 MyBatis 二级缓存出现脏数据,可以通过以下配置进行控制:

  1. <insert><update><delete> 标签上设置 flushCache="!!1_!!" 可以确保执行写操作后刷新缓存,这是默认行为
  2. <select> 标签上设置 useCache="!!2_!!" 可以强制该查询不使用二级缓存,每次都查询数据库
  3. 对于涉及同一张表的多个 Mapper,推荐使用 !!3_!! 属性关联它们,使它们共享同一个缓存实例
  4. 在多表关联查询中,如果任何一张表的数据发生变化,都应清空相关缓存,可通过设置 flushCache="!!4_!!" 实现
13
简答题

MyBatis 二级缓存在什么情况下会产生脏数据?请列举至少三种典型场景,并说明相应的解决方案。

14
判断题

MyBatis 的一级缓存(SqlSession 级别)在 SqlSession 关闭后会被销毁。

A

B

15
判断题

MyBatis 的二级缓存只需要在 Mapper XML 文件中添加 <cache/> 标签即可开启,不需要修改全局配置。

A

B

← 上一个试卷 生态工具与扩展专题测试
下一个试卷 → 高级映射与复杂场景专题测试

📝 发现内容有误?点击此处直接编辑

想参加完整模拟考试?
小程序提供计时考试、自动评分和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库