ORM 缓存抓取

共 20 题
#

1. MyBatis 一级缓存与二级缓存的实现差异?

A 一级缓存作用域是 namespace,二级缓存作用域是 SqlSession
B 两级缓存都默认开启,无需配置
C 一级缓存默认开启、作用域是 SqlSession,二级缓存需显式配置、作用域是 namespace ✓ 正确答案
D 二级缓存作用域最小,比一级缓存更安全
#

2. N+1 问题的检测与优化,JOIN FETCH、@EntityGraph、子查询?

A JOIN FETCH、@EntityGraph、子查询都旨在把多次关联查询合并为少数查询,避免 N+1 ✓ 正确答案
B N+1 指一次查询返回 N 条记录,性能最优
C N+1 问题只能通过增加数据库索引解决
D 懒加载永远不会产生 N+1 问题
#

3. ORM(Hibernate、MyBatis、JPA、SQLAlchemy)的 N+1 查询问题?

A N+1 问题是懒加载关联集合时逐个查询导致的,MyBatis、JPA、SQLAlchemy 都可能有,需用 join/批量抓取优化 ✓ 正确答案
B 只有 Hibernate 有 N+1 问题,其他 ORM 没有
C N+1 问题与懒加载无关
D 使用任何 ORM 都无法避免 N+1
#

4. Hibernate 一级缓存(Session 级)与二级缓存(SessionFactory 级)的生命周期、失效与并发控制?

A 一级缓存是 SessionFactory 级,二级缓存是 Session 级
B 二级缓存默认开启,无需配置
C 两级缓存生命周期完全相同,都随 Session 关闭
D 一级缓存随 Session 生灭,二级缓存随 SessionFactory 生灭且需并发策略控制一致性 ✓ 正确答案
#

5. Hibernate 二级缓存的并发访问策略(read-only/read-write/nonstrict-read-write/transactional)与失效语义

A nonstrict-read-write 更新时使缓存失效,不保证绝对一致,适合读多写少场景 ✓ 正确答案
B read-only 策略允许实体被更新
C transactional 策略性能最高且不保证一致
D 四种策略在一致性上完全相同
#

6. Hibernate 的自动 flush(FlushMode.AUTO)会在查询前把脏数据写入数据库,为什么会导致意外写库与性能抖动?如何显式控制 flush 时机?

A 自动 flush 会在查询前把脏数据写入数据库,可能造成意外写库与性能抖动,可用 FlushMode.COMMIT/MANUAL 显式控制 ✓ 正确答案
B FlushMode.AUTO 只在事务提交时 flush,不会提前写库
C 自动 flush 与写库无关,只影响缓存
D 手动 flush 无法调用,只能依赖自动
#

7. 抓取策略(Fetch Strategy),Lazy、Eager、Join Fetch?

A Eager 是默认策略,最省资源
B 推荐映射用 Lazy,查询时用 JOIN FETCH/@EntityGraph 按需批量抓取,避免 N+1 又避免过度加载 ✓ 正确答案
C Join Fetch 与 Lazy 无关,只是缓存技术
D Lazy 永远不会产生 N+1 问题
#

8. ORM 与原生 SQL 的取舍,复杂查询如何突破 ORM 限制?

A 所有查询都应使用 ORM,完全避免原生 SQL
B ORM 生成的 SQL 一定高效,无需优化
C 原生 SQL 永远优于 ORM
D 简单 CRUD 用 ORM 提升效率,复杂查询用原生 SQL/视图突破 ORM 限制 ✓ 正确答案
#

9. 事务隔离级别设置(在连接池 ORM 与批处理范畴内)?

A 连接池复用时连接上的隔离级别会自动重置,无需处理
B 隔离级别与连接池完全无关
C 隔离级别只有串行化一种
D 隔离级别是连接级状态,复用时会残留,应在事务开始处显式设置并避免影响后续请求 ✓ 正确答案
#

10. MyBatis 一级缓存失效场景,跨 SqlSession、事务提交、SQL 变更,以及二级缓存跨会话的脏读风险?

A 一级缓存跨 SqlSession 共享,不会失效
B 一级缓存执行更新后仍会保留旧数据
C 二级缓存永远与数据库一致,无脏读风险
D 二级缓存跨会话共享,更新不及时失效会导致脏读,需谨慎配置 ✓ 正确答案
#

11. JPA 的抓取策略,fetch=FetchType.LAZY/EAGER、@BatchSize、@EntityGraph 在避免 N+1 时的选择?

A @EntityGraph 定义查询级抓取路径,@BatchSize 批量懒加载,两者都能减少查询次数避免 N+1 ✓ 正确答案
B EAGER 永远是最优策略,应该全局使用
C @BatchSize 与查询次数无关
D @EntityGraph 只能用于一对一,不能用于集合
#

12. Hibernate 查询缓存(Query Cache)的失效机制与使用风险

A 查询缓存不需要二级缓存配合即可正常工作
B 查询缓存永远与数据库一致,无风险
C 查询缓存基于查询空间失效,若数据被其他应用修改而 Hibernate 未感知,会产生脏读 ✓ 正确答案
D 查询缓存失效粒度非常精确,不会过度失效
#

13. ORM 的一级缓存(Session/EntityManager)与事务边界,为什么跨事务复用持久化上下文会导致脏读与连接泄漏?如何用 clear/evict 或短生命周期 Session 规避?

A 持久化上下文应随事务生灭,跨事务复用会导致脏读与连接泄漏,可短生命周期化或用 clear/evict 规避 ✓ 正确答案
B 一级缓存应跨事务复用,共享越久越好
C 跨事务复用持久化上下文不会影响连接
D 一级缓存与事务无关,不需要边界
#

14. 为什么一级缓存只对按 ID 加载(get/load)命中,而 HQL/JPQL 查询结果不会自动放入一级缓存?查询缓存与一级缓存的配合规则是什么?

A HQL/JPQL 查询结果会自动放入一级缓存
B 一级缓存按 ID 缓存实体,查询结果需用查询缓存缓存标识符列表,查询缓存与二级缓存配合 ✓ 正确答案
C 查询缓存不需要二级缓存配合
D 一级缓存按 SQL 文本缓存,与 ID 无关
#

15. MyBatis 二级缓存的 cache 标签参数(flushInterval、size、readOnly、eviction)如何影响并发读写与过期行为?

A size 越大缓存永远不会过期
B readOnly=true 时返回独立副本,并发最安全
C eviction 决定缓存刷新频率
D flushInterval 控制缓存条目过期时间,size+eviction 控制容量与淘汰,readOnly 决定并发安全 ✓ 正确答案
#

16. Hibernate 批量抓取(@BatchSize)与二级缓存组合在避免 N+1 时的注意点?

A @BatchSize 与二级缓存完全无关
B 组合时 @BatchSize 批量懒加载减少查询次数,二级缓存减少数据库访问,但需注意缓存一致性与批量 SQL 负载 ✓ 正确答案
C 使用二级缓存后无需 @BatchSize
D 组合使用必然导致脏读
#

17. ORM 缓存的分布式一致性,本地缓存与 Redis 的取舍?

A 本地缓存天然跨实例一致,无需处理
B Redis 缓存永远与数据库强一致
C 多实例下本地缓存需失效广播保证一致,Redis 跨实例共享一致性更好但增加网络往返,按需要取舍 ✓ 正确答案
D 分布式场景下不能用缓存
#

18. ORM 一级缓存的逐出(evict/clear)与刷新(refresh),什么场景必须绕过一级缓存直查数据库?

A 当缓存实体与数据库不一致时,可用 refresh 强制重读或 evict/clear 后重新查询,绕过一级缓存 ✓ 正确答案
B evict 重新从数据库加载实体,refresh 从缓存移除实体
C 一级缓存永远与数据库一致,无需刷新
D clear 只清除单个实体
#

19. ORM 缓存与数据库隔离级别的关系(缓存读取是否绕过事务快照)

A 缓存读取会应用数据库事务快照,保证一致
B 缓存与隔离级别完全等价
C 缓存读取绕过数据库事务快照,可能读到过期数据,需靠失效/刷新机制保证一致 ✓ 正确答案
D 缓存读取永远是最新数据
#

20. 把 Hibernate 二级缓存接入 Redis 等分布式缓存时,region 的序列化、失效广播与数据库一致性如何保证?

A 实体无需序列化,region 直接存对象引用
B 先写缓存再写库能保证一致性
C 失效广播只在本实例生效,无需跨实例
D 需保证 region 数据可序列化、用 pub/sub 广播失效,并采用先写库再失效缓存的 Cache-Aside 保证一致性 ✓ 正确答案