全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📝 1 篇文章 15 道配套习题

缓存机制专题

专题说明

本专题精选15道代表性题目,系统讲解MyBatis的缓存机制,涵盖一级缓存(SqlSession级别)、二级缓存(Mapper级别/跨Session)、缓存配置(eviction淘汰策略、size/flushInterval/readOnly)、自定义缓存实现(Cache接口、LruCache/ScheduledCache装饰器)、缓存脏数据预防(flushCache、useCache、cache-ref)等核心内容,是MyBatis性能优化的重要手段。

学习目标

  1. 理解一级缓存的作用域、生命周期与失效场景
  2. 掌握二级缓存的开启条件与配置方式
  3. 熟悉缓存淘汰策略(LRU、FIFO、SOFT、WEAK)
  4. 掌握缓存配置属性(size、flushInterval、readOnly、eviction)
  5. 了解自定义缓存实现的接口与装饰器
  6. 掌握缓存脏数据的预防方案

学习内容

本专题涵盖以下3个知识点:

知识点题目数核心内容
一级缓存4题作用域、生命周期、失效场景、默认开启
二级缓存6题开启条件、配置属性、跨Session共享、cache-ref
缓存配置5题淘汰策略、自定义实现、装饰器、脏数据预防

学习建议

  • 先阅读完整指南文章,理解两级缓存的整体架构
  • 重点区分一级缓存与二级缓存的作用域差异
  • 二级缓存需要同时满足全局配置和Mapper配置两个条件
  • 理解缓存淘汰策略的适用场景
  • 注意脏数据问题及预防方案
  • 自定义缓存实现是扩展分布式缓存的基础

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

📝 配套习题(15 题)

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

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

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

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

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

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