# 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 保证一致性 ✓ 正确答案