连接池与数据源(HikariCP/Druid)

共 18 题
📑 题目列表 18 题
#
★★★

1. HikariCP 为什么快,ConcurrentBag 无锁借用、FastList 跳过已检查连接、字节码级优化

HikariCP 为什么快?请解释 ConcurrentBag 无锁借用、FastList 跳过已检查连接以及字节码级优化等原理?

  • ConcurrentBag 的无锁借用机制
  • FastList 的优化
  • 字节码级优化(JIT)

HikariCP 高性能来自多个层面的优化。ConcurrentBag 是核心的无锁容器:它维护一个"未使用连接"列表(threadLocal 缓存 + 共享队列),借用连接时优先从当前线程的 threadLocal 缓存获取(无锁),命中则直接返回,未命中再从共享队列 CAS 获取;显著减少锁竞争。归还连接时加入 threadLocal,使连接倾向于在同一线程复用。FastList 是 HikariCP 自实现的 ArrayList,用于存储 PreparedStatement 的 key,它在移除元素时跳过已检查的连接(remove 时避免遍历),并减少范围检查,性能优于 JDK ArrayList。字节码级优化:HikariCP 通过 JIT 友好的小而内联方法、避免不必要的对象分配、使用同步的细粒度控制,让热点代码能被 JIT 完美内联与优化,减少方法调用开销。此外它还减少连接初始化开销(如 lazy 加载、避免每次校验)。整体上,HikariCP 通过"无锁借用 + 快速数据结构 + JIT 友好"实现了极低延迟。

本题考察 HikariCP 高性能的底层原因。核心是 ConcurrentBag 的无锁借用(threadLocal 缓存)、FastList 的快速遍历、以及 JIT 友好的字节码优化,三者共同降低连接获取开销。

#
★★★

2. HikariCP 的 HouseKeeper 后台线程与连接健康检查(connectionTestQuery/keepaliveTime)

HikariCP 的 HouseKeeper 后台线程与连接健康检查(connectionTestQuery、keepaliveTime)如何工作?

  • HouseKeeper 线程的职责
  • 连接健康检查机制
  • connectionTestQuery 与 keepaliveTime

HikariCP 的 HouseKeeper 是一个后台定时线程,负责连接池的维护任务:定期执行连接超时回收(idleTimeout)、连接最大寿命检查(maxLifetime)、连接泄漏检测(leakDetectionThreshold)以及连接健康检查。连接健康检查方面:connectionTestQuery 用于指定测试查询(如 MySQL 的 SELECT 1,或设置为空则用驱动自带的 is_valid 校验),在连接被借用前或归还时验证连接是否有效;keepaliveTime 用于设置连接保活间隔,当空闲连接超过 keepaliveTime 未活动时,HouseKeeper 会对其执行一次验证查询(即使未达到 idleTimeout),确保连接在空闲期间仍健康,避免数据库 wait_timeout 或网络切换导致连接失效。整体上,HouseKeeper 结合 connectionTestQuery、keepaliveTime、maxLifetime 等参数,维护连接池中连接的健康与可用性。

本题考察 HikariCP 的后台维护机制。核心是 HouseKeeper 线程的定时任务,以及 connectionTestQuery(校验语句)、keepaliveTime(保活间隔)与 maxLifetime 的协同。

#
★★★

3. 连接池的 registerMbeans 与 JMX 监控指标(active/idle/pending/total)暴露

连接池的 registerMbeans 与 JMX 监控指标(active/idle/pending/total)如何暴露与使用?

  • registerMbeans 配置
  • JMX 指标含义
  • 监控告警

HikariCP 通过 registerMbeans 配置(spring.datasource.hikari.register-mbeans=true)把连接池指标注册到 JMX,供监控系统(如 JConsole、Prometheus/JMX exporter)采集。核心指标包括:active(当前活跃连接数,即正在被应用使用的连接)、idle(空闲连接数,即池中未被使用的连接)、pending(等待获取连接的线程数,pending>0 说明连接池快耗尽)、total(池中总连接数,active+idle)。这些指标用于判断连接池健康:active 持续接近 maximumPoolSize 且 pending 增长,说明连接池可能不足或存在连接泄漏;idle 长期为 0 需关注。Druid 也可通过 stat-enable 或 JMX 暴露类似指标。监控的作用是预警连接池耗尽、连接泄漏与慢 SQL,配合告警规则(如 pending 阈值、active 比率)驱动扩容或排查。

本题考察连接池监控。核心是 registerMbeans 开启 JMX 暴露,以及 active/idle/pending/total 四个指标的含义与告警判断。

#
★★★

4. 连接泄漏的检测与定位,leakDetectionThreshold、连接借用追踪与栈信息分析

连接池连接泄漏如何检测与定位?leakDetectionThreshold、连接借用追踪与栈信息分析如何配合?

  • 连接泄漏的概念
  • leakDetectionThreshold 配置
  • 借用追踪与栈信息

连接泄漏指应用借用连接后未正确归还,导致连接池被耗尽。检测与定位手段:leakDetectionThreshold 是 HikariCP 的泄漏检测阈值,设置后 HikariCP 会在连接被借用超过该时长仍未归还时,打印一条告警日志("Connection leak detection triggered"),并可选地记录创建该连接的堆栈信息(通过 -Dcom.zaxxer.hikari.housekeeping.connectionLeakStackTrace 或日志中打印的栈),帮助定位泄漏点。连接借用追踪:HikariCP 在启用泄漏检测时记录借用连接的创建点栈,泄漏时输出该栈,指示是哪个方法或代码路径拿走了连接未归还。定位流程:设置合理的 leakDetectionThreshold(应大于业务最长事务时间,如 30s~60s),观察泄漏日志与栈信息,找到未归还连接的代码;同时可用 connectionTimeout 控制等待超时,避免因连接耗尽导致无限等待。Druid 则有 RemoveAbandoned 机制自动回收泄漏连接。

本题考察连接泄漏的检测与定位。核心是 leakDetectionThreshold 触发泄漏告警并记录借用栈,结合日志栈分析定位泄漏点,配合 connectionTimeout 控制等待。

spring.datasource.hikari.leak-detection-threshold: 30000
spring.datasource.hikari.connection-timeout: 30000
#
★★★

5. Druid 的 RemoveAbandoned 连接泄漏回收与 HikariCP 的 leakDetectionThreshold 机制对比

Druid 的 RemoveAbandoned 连接泄漏回收与 HikariCP 的 leakDetectionThreshold 机制有何对比?

  • RemoveAbandoned 机制
  • leakDetectionThreshold 机制
  • 两机制的差异

Druid 的 RemoveAbandoned 是"主动回收"机制:当连接被借用超过 removeAbandonedTimeoutMillis 且未归还时,Druid 会主动关闭(回收)该连接,并记录日志,防止连接池被泄漏连接耗尽;需配合 removeAbandoned=true 开启,并设置 logAbandoned=true 输出泄漏栈。HikariCP 的 leakDetectionThreshold 是"被动告警"机制:连接借用超过阈值未归还时,打印泄漏告警日志并记录栈,但不会主动关闭连接,仅提示开发者排查。两者差异:Druid 的 RemoveAbandoned 会强制回收泄漏连接(更激进,适合防止池耗尽,但可能中断正在执行的业务 SQL);HikariCP 的 leakDetectionThreshold 只告警不回收(更保守,不破坏业务,但依赖人工修复)。选取:追求防泄漏、允许强制回收选 Druid RemoveAbandoned;追求业务稳定、以告警驱动修复选 HikariCP leakDetectionThreshold。

本题考察两种连接池的泄漏处理机制对比。核心差异是"主动回收(Druid)vs 被动告警(HikariCP)",以及各自的适用取向。

#
★★★

6. Druid 的 WallFilter SQL 防火墙规则配置与批量操作/多语句的放行策略

Druid 的 WallFilter SQL 防火墙规则如何配置?批量操作与多语句如何放行?

  • WallFilter 的作用
  • 防火墙规则配置
  • 批量/多语句放行

Druid 的 WallFilter 是 SQL 防火墙,用于拦截危险 SQL 与 SQL 注入攻击,如禁止 delete/update 无 where、禁止表名/字段名校验、禁止特定函数、禁止多语句等。通过配置 WallConfig 启用:wall-filter 的 config 中可设置 deleteAllowupdateAllowmultiStatementAllowselectAllowcommentAllow 等规则。批量操作与多语句放行:Druid 默认禁止多语句执行(防止 SQL 注入中拼接多条语句),若业务确实需要批量插入(如通过 rewriteBatchedStatements 或一次执行多条 INSERT),需在 WallConfig 中设置 multiStatementAllow=true 放行多语句;同时批量参数化操作(addBatch/executeBatch)不后续多语句,但需注意防火墙对批量语句的校验。放行策略需权衡安全与功能:默认关闭多语句,仅在明确需要且语句安全可控时开启,并配合表名/字段白名单校验。

本题考察 Druid SQL 防火墙的配置与放行。核心是 WallFilter 拦截危险 SQL,批量/多语句需通过 multiStatementAllow 等规则显式放行,且要权衡安全。

#
★★

7. 虚拟线程环境下连接池仍是稀缺资源,Semaphore 或池等待时间实施并发准入的策略

虚拟线程环境下连接池仍是稀缺资源,如何通过 Semaphore 或池等待时间实施并发准入策略?

  • 虚拟线程与连接池的关系
  • 并发准入(限流)策略
  • Semaphore 与等待时间

虚拟线程(Virtual Thread)极大提升了并发线程数,但数据库连接仍是稀缺资源(受数据库 max_connections 限制),因此虚拟线程下连接池仍可能成为瓶颈。需要并发准入(限流)策略:一是利用连接池自身的等待时间(connectionTimeout)作为准入控制——当并发超过连接池容量时,新请求等待连接,超过 timeout 则失败,天然限制并发;二是使用 Semaphore 信号量在应用层做并发准入,在调用数据库前先 acquire 信号量(限制同时访问数据库的操作数),避免连接池排队积压。策略实施:设定一个不超过连接池容量(或数据库 max_connections)的并发上限,用 Semaphore 控制;配合连接池的 connectionTimeout 设置合理等待上限,超时快速失败(熔断),避免请求无限堆积。因此虚拟线程下引入连接池 + 并发准入(Semaphore/超时)是必要的。

本题考察虚拟线程下的连接池资源管理。核心是虚拟线程虽多但连接有限,需用 Semaphore 或池等待时间做并发准入,避免连接池成为瓶颈。

#
★★

8. 数据库重启或网络闪断后连接池如何自动恢复,为什么依赖连接校验与 maxLifetime 的协调

数据库重启或网络闪断后,连接池如何自动恢复?为什么依赖连接校验与 maxLifetime 的协调?

  • 连接池的自动恢复机制
  • 连接校验的作用
  • 与 maxLifetime 的协调

数据库重启或网络闪断后,池中已有的连接可能已失效(底层 socket 断开),连接池需要自动恢复。恢复机制:连接池通过连接校验(connectionTestQuery 或 is_valid)在借用/归还时检测失效连接,发现失效则丢弃并重建;同时 maxLifetime 保证连接在不超过最大寿命时被销毁重建,避免长期占用失效连接。为什么需要协调:仅靠连接校验,若数据库重启期间没有新请求,失效连接无法被及时发现;maxLifetime 定期替换连接,加上校验,能保证数据库恢复后连接池尽快重建健康连接。此外,HikariCP 的 HouseKeeper 定期(keepaliveTime)主动校验空闲连接,进一步加速恢复。整体流程:数据库恢复后,连接池通过校验淘汰失效连接、按需新建,池中连接逐渐恢复健康,应用无需重启。

本题考察连接池的自动恢复。核心是"连接校验淘汰失效连接 + maxLifetime 定期重建 + keepaliveTime 主动保活"三者协调,使数据库恢复后连接池自动重建。

#
★★

9. Druid 的监控统计(StatFilter/WallFilter/SpringFilter)与 SQL 防注入的工程价值

Druid 的监控统计(StatFilter/WallFilter/SpringFilter)与 SQL 防注入各有什么工程价值?

  • StatFilter 与 SpringFilter 的作用
  • WallFilter 的防注入
  • 工程价值

Druid 的多种 Filter 各自承担职责。StatFilter:统计 SQL 执行的各项指标(执行时间、次数、并发、慢 SQL 等),提供 SQL 监控与性能分析,是排查慢 SQL 与连接池压力的基础。WallFilter:SQL 防火墙,拦截危险 SQL 与 SQL 注入攻击(如利用参数拼接注入、危险函数、多语句),是防注入的安全防线。SpringFilter:用于集成 Spring 的监控,抓取调用链中的 SQL 执行情况,把 SQL 与业务方法关联。工程价值:StatFilter 提供可观测性(慢 SQL、频繁 SQL 定位),WallFilter 提供安全防护(防注入、防误删),SpringFilter 打通应用层与 SQL 层的链路。三者组合让 Druid 既能"看得见"(监控)又能"守得住"(安全),是工程中数据库健康与安全的基石。

本题考察 Druid Filter 的工程价值。StatFilter 负责监控统计、WallFilter 负责防注入安全、SpringFilter 负责链路集成,三者分别解决"可观测性"与"安全性"。

#
★★

10. HikariCP 的 initializationFailTimeout 与连接池启动失败的快速失败策略

HikariCP 的 initializationFailTimeout 与连接池启动失败的快速失败策略是什么?

  • initializationFailTimeout 的含义
  • 启动失败的行为
  • 快速失败策略

HikariCP 的 initializationFailTimeout 控制连接池初始化时,若数据库不可用(连接创建失败)的行为。设置为正数(如 1 或更大)时,若初始化期间无法成功创建连接,连接池会抛出异常,导致应用启动失败(fail-fast,快速失败),避免应用在数据库不可用时仍启动,后续请求全部失败;设置为 0 时,连接池初始化时若连接失败不会抛异常,应用仍然启动,但池中无连接,后续借用时才尝试创建(延迟初始化);设置为负数则跳过初始化连接。快速失败策略的价值:在数据库配置错误或数据库不可用时,应用立即启动失败,暴露问题,避免"应用起来了但所有请求都报错"的假象。生产环境通常设为正值(如 1)以保证启动时就确认数据库可用。

本题考察连接池的启动快速失败。核心是 initializationFailTimeout>0 时数据库不可用则启动失败,=0 时延迟初始化不阻塞启动,按需选择。

spring.datasource.hikari.initialization-fail-timeout: 1
#
★★

11. HikariCP 的并发设计,FastList、ConcurrentBag 与无锁获取连接的核心如何?

HikariCP 的并发设计中,FastList、ConcurrentBag 与无锁获取连接的核心是什么?

  • ConcurrentBag 无锁借用
  • FastList 的优化用途
  • 无锁获取连接的核心

HikariCP 并发设计的核心是"减少锁竞争"。ConcurrentBag 是无锁连接容器:它把连接分到"线程本地(threadLocal)"与"共享队列"两部分,借用连接时优先从当前线程的 threadLocal 无锁获取(命中率高的局部缓存),未命中才通过 CAS 从共享队列获取,从而把锁竞争降到最低;归还连接时放入 threadLocal,使连接尽量在同一线程复用。FastList 是 HikariCP 自实现的高效列表,主要用于存储连接上被缓存的 PreparedStatement(key),它在移除元素时跳过已检查项、减少范围检查,比 JDK ArrayList 更高效,降低连接复用时的开销。无锁获取连接的核心:借用走 threadLocal 局部缓存(无锁)+ 共享队列 CAS(有限竞争),配合 FastList 减少连接内缓存管理开销,使连接获取路径尽量无锁、快速。

本题考察 HikariCP 的并发设计。核心是 ConcurrentBag 的 threadLocal+共享队列两级无锁结构、FastList 的高效缓存管理,共同实现低锁竞争、快速获取连接。

#
★★

12. 连接池参数与问题排查,最大连接数、泄漏检测、慢 SQL 与连接被占满如何定位?

连接池参数与问题排查中,最大连接数、泄漏检测、慢 SQL 与连接被占满分别如何定位?

  • 最大连接数(maximumPoolSize)配置
  • 泄漏检测
  • 慢 SQL 与连接占满的排查

连接池问题排查围绕几个维度。最大连接数(maximumPoolSize):根据数据库 max_connections 与业务并发设置,过大浪费数据库连接、过小导致请求排队。泄漏检测:开启 leakDetectionThreshold(HikariCP)或 RemoveAbandoned(Druid),定位未归还连接。慢 SQL:通过连接池监控(慢 SQL 统计、StatFilter 慢 SQL 日志)与数据库 slow_log 定位执行时间长的 SQL,优化索引或语句。连接被占满(active 达到 maximumPoolSize 且 pending 增长):排查是否连接泄漏(借用未归还)、是否慢 SQL 长时间占用连接、是否并发过高超出池容量;通过监控 active/idle/pending 指标,结合泄漏日志与慢 SQL 定位根因。整体排查流程:先看监控指标判断是否占满,再分"泄漏/慢 SQL/并发"三类定位,最后通过调整参数(最大连接数、超时、泄漏阈值)与优化 SQL 解决。

本题考察连接池问题的排查方法论。核心是"连接被占满"的根因分类(泄漏、慢 SQL、并发超容),以及结合监控指标、泄漏日志、慢 SQL 定位。

#
★★

13. 读写分离多数据源下连接池隔离与事务绑定(@Transactional 切到写库)的实现

读写分离多数据源下,连接池隔离与事务绑定(@Transactional 切到写库)如何实现?

  • 多数据源连接池隔离
  • 读写分离路由
  • @Transactional 绑定写库

读写分离通常配置多数据源(主库/写库 + 从库/读库),需实现连接池隔离与事务绑定。连接池隔离:为每个数据源配置独立的连接池(如主库池、从库池),避免读写连接互相影响。读写分离路由:通过自定义 DataSource 路由(如 AbstractRoutingDataSource 或 ShardingSphere 的读写分离),按操作类型(读/写)选择数据源——写操作走主库,读操作默认走从库。事务绑定:@Transactional 开启的事务必须绑定到写库(主库),因为事务内可能有写操作,且主从延迟会导致读不到刚写入的数据;实现上,当开启事务时(Spring 事务同步),把连接路由强制切到主库,使事务内所有操作(含读)都走主库,保证事务内数据一致。常用做法是 AbstractRoutingDataSource 结合 ThreadLocal 标记当前线程是否在事务中,事务内强制路由主库。

本题考察读写分离多数据源的事务绑定。核心是连接池按库隔离、路由按读写类型选择,以及 @Transactional 开启时强制切到主库保证事务一致性。

public class RoutingDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        // 事务内强制走主库(write),否则走读库(read)
        return TransactionSynchronizationManager.isActualTransactionActive()
                ? "write" : "read";
    }
}
#

14. 连接池核心参数(maximumPoolSize/connectionTimeout/idleTimeout/maxLifetime)与 MySQL wait_timeout 的协调

连接池核心参数(maximumPoolSize、connectionTimeout、idleTimeout、maxLifetime)与 MySQL 的 wait_timeout 如何协调?

  • 各核心参数含义
  • 与 wait_timeout 的关系
  • 协调配置

连接池核心参数:maximumPoolSize 是池中最大连接数;connectionTimeout 是获取连接的最大等待时间(超时抛异常);idleTimeout 是空闲连接多长时间被回收(一般小于 maxLifetime);maxLifetime 是连接最大存活时间,超过则销毁重建。MySQL 的 wait_timeout 是服务器端空闲连接超时时间,超过该时间未活动,MySQL 会关闭该连接。协调要点:maxLifetime 必须小于 wait_timeout(如 maxLifetime 设为 30 分钟,wait_timeout 设为 8 小时),否则连接在空闲超过 wait_timeout 被 MySQL 关闭后,连接池仍持有该"失效"连接,借用时才发现不可用(需连接校验兜底)。同时 idleTimeout 应小于 maxLifetime。通过"maxLifetime < wait_timeout + 连接校验"的配置,保证连接池中的连接在 MySQL 关闭前被销毁重建,避免失效连接。

本题考察连接池参数与数据库超时的协调。核心是 maxLifetime 必须小于 MySQL wait_timeout,否则连接被服务器关闭后池中仍持有失效连接,需配合连接校验。

#

15. 连接池大小如何按 TPS、RT 与数据库 max_connections 推算(公式与压测验证)

连接池大小如何按 TPS、RT 与数据库 max_connections 推算?公式与压测验证如何做?

  • 连接池大小理论公式
  • TPS 与 RT 的关系
  • 压测验证

连接池大小的经典理论依据是 Little's Law 的变体:所需连接数 ≈ 并发请求数 = TPS × 平均响应时间(RT)。即池大小应近似等于"每秒请求数 × 单请求平均耗时(秒)",例如 TPS=1000、RT=50ms,则并发连接 ≈ 1000 × 0.05 = 50 个。同时受数据库 max_connections 限制,池大小 + 其他应用连接数 + 管理连接数应小于数据库 max_connections,预留余量。连接数过多会浪费数据库连接与内存、增加上下文切换;过少会导致排队等待。压测验证:用压测工具(JMeter、ab)模拟目标 TPS,在监控中观察 active 连接数是否达到瓶颈、数据库 CPU/连接是否饱和、响应时间是否达标,据此调整池大小。经验公式给出初始值,压测验证并微调,形成"算后测、测后调"的闭环。

本题考察连接池大小的确定方法。核心是 Little's Law 公式(连接数≈TPS×RT),受 max_connections 约束,并用压测验证微调。

#

16. Druid 的监控能力,StatFilter、SQL 防火墙与慢 SQL 日志的工程配置如何?

Druid 的监控能力中,StatFilter、SQL 防火墙与慢 SQL 日志如何配置?

  • StatFilter 监控配置
  • WallFilter 防火墙配置
  • 慢 SQL 日志

Druid 通过 Filter 组合实现监控与防护。StatFilter:通过 spring.datasource.druid.filter.stat.enabled=true 开启,统计 SQL 执行时间、次数、并发,并生成慢 SQL 日志(slowSqlMillis 设置慢 SQL 阈值,超过则记录到日志)。WallFilter:spring.datasource.druid.filter.wall.enabled=true 开启 SQL 防火墙,配置 WallConfig 拦截危险 SQL 与注入。慢 SQL 日志:StatFilter 的 logSlowSql=trueslowSqlMillis=xxx 开启慢 SQL 打印,配合连接池的 StatViewServlet 可在 Web 页面查看监控数据。工程配置要点:开启 stat 与 wall 两个 filter,配置慢 SQL 阈值与日志输出,必要时开启 StatViewServlet 提供监控 UI,并设置访问权限(allow/deny)。整体实现"监控可观测 + 防火墙防注入 + 慢 SQL 告警"。

本题考察 Druid 监控的工程配置。核心是 StatFilter(统计+慢 SQL)、WallFilter(防火墙)、StatViewServlet(监控 UI)的开启与参数配置。

#

17. 连接池耗尽时的快速失败,获取超时、队列与熔断的工程配置如何?

连接池耗尽时如何快速失败?获取超时、队列与熔断的工程配置如何做?

  • 获取超时(connectionTimeout)
  • 队列与限流
  • 熔断策略

连接池耗尽时,快速失败可以避免请求无限等待与系统雪崩。获取超时:设置 connectionTimeout(如 3 秒),借用连接超时则抛异常,让请求快速失败而非无限等待。队列与限流:用 Semaphore 或信号量限制并发访问数据库的操作数,避免连接池排队积压;或使用有界队列缓存请求,超出后拒绝。熔断:结合熔断器(如 Resilience4j、Hystrix)在连接耗尽/数据库异常时快速失败并进入熔断状态,一段时间后尝试恢复,防止下游故障拖垮应用。工程配置组合:连接池 connectionTimeout 设置合理超时 + 信号量限流 + 熔断器兜底,实现"超时快速失败、限流防止积压、熔断隔离故障"。整体提升系统在高并发或数据库故障时的稳定性。

本题考察连接池耗尽的快速失败。核心是 connectionTimeout 超时快速失败、信号量限流防积压、熔断器隔离故障三层组合。

#

18. HikariCP 通过 Micrometer 暴露指标(hikaricp.connections.*)与连接耗尽告警配置

HikariCP 如何通过 Micrometer 暴露指标(hikaricp.connections.*)?连接耗尽告警如何配置?

  • Micrometer 集成
  • hikaricp.connections 指标
  • 连接耗尽告警

Spring Boot 通过 Micrometer 自动暴露 HikariCP 指标,无需额外配置(只要引入 micrometer-registry-prometheus 等)。HikariCP 暴露的指标以 hikaricp.connections.* 为前缀,包括:hikaricp.connections.active(活跃连接数)、hikaricp.connections.idle(空闲连接数)、hikaricp.connections.pending(等待线程数)、hikaricp.connections.total(总连接数)、hikaricp.connections.creation(每秒创建数)、hikaricp.connections.timeout(获取超时次数)等。连接耗尽告警配置:在 Prometheus 中配置告警规则,如当 hikaricp_connections_pending 大于 0 持续一段时间,或 hikaricp_connections_active 接近 hikaricp_connections_max 且持续时告警,提示连接池接近耗尽,需排查连接泄漏或扩容。也可对 hikaricp_connections_timeout 超时次数告警。整体实现"指标采集 + 告警规则"的完整监控闭环。

本题考察 HikariCP 的 Micrometer 指标与告警。核心是 hikaricp.connections.* 系列指标的含义,以及基于 pending/active 接近 max 的告警规则。