事务与连接池

共 53 题
#

1. Bean 销毁时连接池优雅关闭

A 直接关闭连接池即可,无需等待
B 优雅关闭与事务无关
C 优雅关闭应先停止接收新请求,等待在途事务完成后再关闭连接池 ✓ 正确答案
D 停机时无需考虑借出连接
#

2. Druid 监控在 Spring Boot Actuator 中暴露的连接池指标与 Prometheus Micrometer 维度有何差异

A Druid 侧重 SQL 统计与连接池健康,Micrometer 提供统一指标可被 Prometheus 采集 ✓ 正确答案
B Micrometer 无法采集连接池指标
C Druid 只能采集 Micrometer 指标
D 两者维度完全相同
#

3. HikariCP 的 registerMbeans 边界

A 默认开启
B 它控制是否将连接池注册到 JMX 暴露指标 ✓ 正确答案
C 它用于 SQL 改写
D 它无法被 JMX 监控
#

4. JDBC 事务的 ACID 与隔离级别

A READ_UNCOMMITTED 防止脏读
B SERIALIZABLE 并发性能最高
C REPEATABLE_READ 可防止不可重复读 ✓ 正确答案
D 隔离级别越高并发越高
#

5. JPA 与 Hibernate 6.x 在 Spring Boot 4.0 中是否默认支持 Scoped Values 替代 ThreadLocal 事务上下文

A Spring Boot 4.0 默认仍用 ThreadLocal 存储事务上下文,未切换到 Scoped Values ✓ 正确答案
B Spring 事务上下文已默认改用 Scoped Values
C Scoped Values 支持可变绑定
D 事务上下文与 ThreadLocal 无关
#

6. JTA 与 Spring Boot 4.0 的 Atomikos 集成在 Seata AT 模式下是否存在事务悬挂风险

A 两者完全兼容,无风险
B Seata AT 也是两阶段提交
C 混用不会占用连接
D 两种协调机制不同,混用可能产生事务悬挂风险 ✓ 正确答案
#

7. PreparedStatement 缓存与 Oracle cursor 关闭

A 游标数量无上限
B 连接池无需关闭连接上的 Statement
C 未正确关闭的 PreparedStatement 可能耗尽 Oracle 游标上限 ✓ 正确答案
D PS 缓存与游标无关
#

8. Spring @Transactional 嵌套调用与 REQUIRED 传播行为在 JDK 25 虚拟线程下的回滚边界如何正确处理

A 内层可独立提交
B 嵌套调用加入同一事务,回滚边界由最外层事务决定 ✓ 正确答案
C 捕获异常后事务一定不回滚
D 虚拟线程下 ThreadLocal 失效
#

9. Spring ChainedTransactionManager 在 Spring Boot 4.0 是否仍可用

A 它保证 XA 原子性
B Spring Boot 4.0 已完全移除
C 它按顺序提交多个事务管理器,但不保证原子性 ✓ 正确答案
D 它用于单数据源
#

10. Spring 事务管理器在 JDK 25 中是否仍依赖 TransactionSynchronizationManager 的 ThreadLocal

A JDK 25 已完全改用 Scoped Values
B 虚拟线程下 ThreadLocal 无法隔离
C 事务上下文不绑定线程
D 事务管理器仍依赖 TransactionSynchronizationManager 的 ThreadLocal 绑定事务上下文 ✓ 正确答案
#

11. XA 分布式事务在多数据源连接池中 Atomikos/Narayana 的工程取舍

A 2PC 不会悬挂
B XA 无性能开销
C XA 通过两阶段提交保证强一致,但性能与协调复杂度高 ✓ 正确答案
D XA 仅用于单数据源
#

12. XADatasource(JTA)与分布式事务的边界

A XADataSource 提供 XA 连接参与 JTA 分布式事务 ✓ 正确答案
B XA 连接可由普通连接池提供
C JTA 只能管理单数据源
D XA 与两阶段提交无关
#

13. leakDetectionThreshold 只能报告疑似长占用而非证明泄漏,如何结合栈信息确认根因

A 超过阈值即证明泄漏
B 它无法提供创建连接的栈
C 长事务不可能是原因
D 它报告疑似长占用,需结合借出栈与线程状态确认是否真泄漏 ✓ 正确答案
#

14. 事务中夹杂远程调用为何会长期占用连接,怎样重划事务边界又不破坏业务一致性

A 远程调用应放事务内保证原子性
B 事务内远程调用会长期占用连接,应将远程调用移出事务并用补偿保证一致 ✓ 正确答案
C 重划边界必然破坏一致性
D 事务不占用连接
#

15. 事务超时(@Transactional timeout)如何作用于底层连接,与连接池 connectionTimeout、JDBC socketTimeout 的协作与覆盖关系是什么

A connectionTimeout 约束获取连接,socketTimeout 约束网络,@Transactional timeout 约束事务内 SQL 执行 ✓ 正确答案
B 三者互相覆盖
C @Transactional timeout 约束获取连接
D socketTimeout 约束事务提交
#

16. 使用 R2DBC 响应式连接池与 JDBC 连接池并存时,事务边界如何跨线程同步

A 可用 ThreadLocal 统一同步
B 两者事务模型不同,无法直接跨线程同步,需分别管理 ✓ 正确答案
C 两者共享同一事务边界
D R2DBC 事务也绑定 ThreadLocal
#

17. 启用虚拟线程后数据库连接仍是稀缺资源,如何用信号量或池等待时间实施并发准入

A 虚拟线程无并发限制,无需准入
B 连接永不稀缺
C 可用信号量限制并发访问数据库,配合池等待超时防止连接耗尽 ✓ 正确答案
D 信号量会放大连接占用
#

18. 外层事务并发触发多个 REQUIRES_NEW 为何可能耗尽连接池导致自锁,容量规划应如何考虑嵌套关系

A REQUIRES_NEW 复用外层连接
B 多层 REQUIRES_NEW 每层占独立连接,可能耗尽连接池导致自锁 ✓ 正确答案
C 连接池无需考虑嵌套
D 嵌套不会增加连接需求
#

19. 如何根据数据库并发能力、查询耗时和目标吞吐估算连接池大小,而不是按虚拟线程数量配置

A 应根据数据库并发能力、查询耗时与目标吞吐估算,而非按线程数 ✓ 正确答案
B 连接池越大越好
C 按虚拟线程数配置即可
D 连接池大小与吞吐无关
#

20. 应用优雅停机时应先拒绝新请求还是先关闭连接池,未完成事务与借出连接如何处理

A 先关闭连接池再等请求
B 直接强制关闭连接
C 无需等待在途事务
D 先拒绝新请求,等待在途事务完成,最后关闭连接池 ✓ 正确答案
#

21. 连接归还池前需要重置 autoCommit、只读、隔离级别和 catalog,遗漏会导致怎样的请求串扰

A 未重置 autoCommit/隔离级别等状态会导致下一个请求串扰 ✓ 正确答案
B 连接池不负责重置状态
C 连接状态无需重置
D 状态残留无影响
#

22. 连接池与 Spring Boot 4.x 的默认切换

A 默认使用 Druid
B Spring Boot 默认使用 HikariCP,可通过配置切换为其他连接池 ✓ 正确答案
C Spring Boot 4.x 默认无连接池
D 无法切换连接池
#

23. @Transactional 在 Spring Data 与 MyBatis 的差异

A 两者事务机制完全不同
B Spring Data 不支持 @Transactional
C 两者都走 Spring 事务,但底层 JPA 用实体脏检查、MyBatis 用显式 SQL ✓ 正确答案
D MyBatis 不用 Spring 事务
#

24. @Transactional 的 Connection 持有与释放

A 连接在事务开始前即归还
B 事务期间连接被持有,事务提交/回滚时归还连接池 ✓ 正确答案
C 业务代码需手动关闭连接
D 事务不影响连接占用
#

25. @TransactionalEventListener(phase = AFTER_COMMIT) 的应用

A 它在事务开启前执行
B 它在事务提交后执行回调,适合提交后发消息/清缓存 ✓ 正确答案
C 它与 @EventListener 相同
D 它无法感知事务状态
#

26. DataSource 的标准接口与 DriverManager 的演进

A DataSource 是标准连接工厂接口,支持连接池与 JTA,替代 DriverManager ✓ 正确答案
B DataSource 无法获取连接
C 两者完全相同
D DriverManager 支持连接池
#

27. Druid 的 SQL 防火墙(Wall Filter)配置

A 它用于分页
B 它拦截危险 SQL,可配置禁止 DDL、多语句等策略 ✓ 正确答案
C 它无法拦截注入
D 它只用于监控
#

28. Druid 的功能(Filter、StatView、Wall)配置

A StatView 用于防火墙
B WallFilter 用于统计
C StatFilter 做 SQL 统计,WallFilter 做防火墙,StatView 提供监控页面 ✓ 正确答案
D 三项功能互斥
#

29. HikariCP 的 connectionTestQuery 与 JDBC 4 兼容性

A HikariCP 优先用 JDBC4 的 isValid 校验,connectionTestQuery 是旧驱动回退 ✓ 正确答案
B isValid 无法校验连接
C connectionTestQuery 总是被使用
D connectionTestQuery 用于分页
#

30. HikariCP 的 connectionTimeout 与 idleTimeout 在云原生弹性扩缩容下应如何动态调整

A connectionTimeout 与 idleTimeout 需结合流量动态调整,避免连接过载或不足 ✓ 正确答案
B 扩缩容不影响连接池
C idleTimeout 控制获取等待
D 配置固定即可
#

31. HikariCP 的 leakDetectionThreshold 在生产环境检测连接泄漏的工程价值

A 它用于 SQL 优化
B 它无法检测泄漏
C 阈值设置无关紧要
D 它能在连接耗尽前预警并定位借出栈,帮助发现泄漏 ✓ 正确答案
#

32. HikariCP 的 maxLifetime 为什么应短于数据库或网络设备的连接寿命,并保留随机退避

A 越长越好
B 无需随机退避
C 应短于数据库/网络连接超时,并随机退避避免集中断连 ✓ 正确答案
D 与底层超时无关
#

33. HikariCP 的 maximumPoolSize 与数据库服务端最大连接数的容量规划取舍

A 池越大越好
B 各实例池大小之和需小于数据库服务端最大连接数 ✓ 正确答案
C 与数据库上限无关
D 无需考虑实例数
#

34. HikariCP 的关键配置(maximumPoolSize、connectionTimeout)

A maximumPoolSize 决定并发能力,connectionTimeout 是获取连接等待超时 ✓ 正确答案
B maximumPoolSize 默认无限
C 两者无关
D connectionTimeout 决定连接池大小
#

35. JDBC RowSet(离线型)在断开连接后仍可操作数据的场景与连接池释放时机

A 它不释放连接
B 它必须长期持有连接
C 它无法离线操作
D 数据加载到内存后断开连接,可离线操作并提前释放连接 ✓ 正确答案
#

36. MySQL JDBC 驱动的 AOT 初始化配置如何最小化

A 驱动无需任何配置即可 AOT
B AOT 不支持 JDBC 驱动
C 需通过反射元数据与初始化配置将驱动初始化提前到构建期并最小化 ✓ 正确答案
D 反射元数据无作用
#

37. NESTED 传播借助 savepoint 实现局部回滚,与 REQUIRES_NEW 在连接占用和回滚范围上有何本质差异

A NESTED 复用外层连接靠 savepoint 局部回滚,REQUIRES_NEW 占独立连接 ✓ 正确答案
B NESTED 独立提交
C 两者都复用连接
D 两者回滚范围相同
#

38. Spring @Transactional 在哪些场景会静默失效(自调用、非 public 方法、异常被 catch、rollbackFor 未配置、代理未生效)

A 自调用仍走代理
B 自调用、非 public、异常被吞、rollbackFor 未配置等都会导致事务失效 ✓ 正确答案
C public 方法不受事务影响
D 默认回滚所有异常
#

39. javax.sql.DataSource 与 Jakarta 演进

A JDBC 完全并入 Jakarta EE
B DataSource 已改为 jakarta.sql
C DataSource 无法获取连接
D JDBC 的 javax.sql 命名空间未随 Jakarta EE 重命名,DataSource 仍是标准连接工厂 ✓ 正确答案
#

40. keepaliveTime、idleTimeout 与 minimumIdle 如何共同作用,保活查询为何不能解决活动连接失效

A 保活查询覆盖所有连接
B 活动连接失效靠保活解决
C 保活查询只在空闲连接上执行,不能解决活动连接失效 ✓ 正确答案
D keepaliveTime 与 idleTimeout 无关
#

41. validationTimeout 与 connectionTimeout 分别约束什么阶段,配置倒置会产生哪些误判

A 两者都约束获取连接
B 配置倒置无影响
C validationTimeout 应大于 connectionTimeout
D connectionTimeout 约束获取连接,validationTimeout 约束连接校验,应小于前者 ✓ 正确答案
#

42. JDK 25 虚拟线程下连接池的 maxPoolSize 默认值是否应根据载体线程数动态调整

A 应等于载体线程数
B 应基于数据库并发能力与吞吐设置,而非载体线程数 ✓ 正确答案
C 无需考虑数据库能力
D 虚拟线程下连接池无限
#

43. Druid 连接池的 WallFilter SQL 防火墙在多数据源应用中的配置边界与绕过风险

A 防火墙无法绕过
B 一个数据源配置即可覆盖全部
C 每个数据源都需配置 WallFilter,否则未配置的数据源成为绕过缺口 ✓ 正确答案
D 多数据源无需配置
#

44. HikariCP 在 Spring Boot 4.x 虚拟线程下使用 synchronized 获取连接的 JEP 491 兼容性与性能边界

A synchronized 对虚拟线程无影响
B HikariCP 无锁
C JEP 491 移除所有 synchronized
D HikariCP 用 synchronized 管理连接,虚拟线程下可能固定载体线程成为性能边界 ✓ 正确答案
#

45. 多租户切换 schema 或会话变量时,怎样保证异常路径也能清理并避免连接泄露租户上下文

A 只需正常路径清理
B 异常时无需清理
C 需在 finally/事务同步中清理租户上下文,避免异常路径残留造成串扰 ✓ 正确答案
D 连接池复用不会继承租户状态
#

46. 连接池与反应式(R2DBC Pool)的边界

A R2DBC 连接池与 JDBC 连接池相同
B R2DBC 连接池以响应式方式获取连接,与阻塞式 JDBC 连接池模型不同 ✓ 正确答案
C 两者可混用
D R2DBC 获取连接阻塞线程
#

47. 连接池在 Spring Modulith 多模块的边界

A 多模块不应共享连接池
B 每个模块各自建池
C 连接池属于业务模块
D 连接池作为基础设施模块的全局单例,业务模块共享 ✓ 正确答案
#

48. 连接池的 connectionTestQuery/validationTimeout 在数据库连接健康检查中的设置

A validationTimeout 应大于 connectionTimeout
B validationTimeout 约束校验超时,connectionTestQuery 是校验 SQL,应小于 connectionTimeout ✓ 正确答案
C 健康检查无需配置
D connectionTestQuery 用于分页
#

49. 连接池的监控指标(活跃、空闲、获取时长)

A 指标无意义
B 获取时长长说明池空闲
C 活跃高说明池过大
D 活跃/空闲/获取时长等指标可定位连接池容量与性能问题 ✓ 正确答案
#

50. 连接池监控中 active、idle、pending、acquire time 和 usage time 如何组合定位容量问题

A 只需看 active 即可
B acquire time 与容量无关
C usage time 高说明池过大
D active 高+acquire 高+pending>0 说明池不足,usage 高说明连接被长占用 ✓ 正确答案
#

51. 连接泄漏(Connection Leak)的检测与防范

A 异常路径无需归还连接
B 连接泄漏无法检测
C 连接未归还导致池耗尽,用泄漏检测与 try-with-resources 防范 ✓ 正确答案
D 连接池会自动归还
#

52. HikariCP 在 GraalVM Native Image 的边界

A HikariCP 依赖反射与动态初始化,需配置反射元数据才能在原生镜像工作 ✓ 正确答案
B 原生镜像完全支持 HikariCP
C HikariCP 无反射
D 无需任何配置
#

53. JDK 25 中虚拟线程与连接池的协作(spring.threads.virtual.enabled=true)

A 虚拟线程下连接池无限
B 连接不再稀缺
C 虚拟线程扩并发,但连接仍是瓶颈,需结合连接池与准入控制 ✓ 正确答案
D 无需连接池管理