HikariCP 数据库连接池配置规范(v2025-12)
适用场景:对外提供接口请求,数据库类型 PostgreSQL / MySQL / Oracle
目标:高并发、低延迟、故障隔离
1 连接池大小与分组
| 参数 | 计算公式 | 示例(4C8G) |
|---|---|---|
minimumIdle |
(CPU 核数 × 2) + 磁盘数 |
(4×2)+2 = 10 |
maximumPoolSize |
minIdle × (2~5) |
10 × 5 = 50 |
约束
- 所有节点
maximumPoolSize总和 ≤ 数据库实例最大连接数- 接口线程与定时任务 必须分离双连接池,避免互相挤占
2 连接可用性校验
| 场景 | 推荐做法 |
|---|---|
| JDBC4 驱动(PG 42.x+) | 无需 connectionTestQuery,Hikari 自动调用 isValid() |
| 旧驱动 | 显式 connectionTestQuery: SELECT 1 |
| 参数 | 建议值 | 说明 |
|---|---|---|
maxLifetime |
900 000 ms(15 min) | 到期强制回收,防止"僵"连接 |
leakDetectionThreshold |
5 000 ms | 持有超 5 s 未归还即打印堆栈,方便排查泄露 |
日志全是无效堆栈,真正泄露被淹没
先拿 P99 SQL 耗时 做基线,再设 leak = P99 × 2;同时把阈值做成 环境变量,灰度时可动态降
3 超时配置(生产网络稳定,宜激进)
| 参数 | 默认 | 建议 | 备注 |
|---|---|---|---|
connectionTimeout |
30 000 ms | 2 000 ms | 拿连接最大等待 |
validationTimeout |
5 000 ms | 1 000 ms | 检测连接有效性;必须 < connectionTimeout |
4 JDBC 层高可用
| 数据库 | 超时参数 | 单位 | 用法示例 |
|---|---|---|---|
| PostgreSQL | socketTimeout |
秒 | jdbc:postgresql://h1,h2/db?socketTimeout=10 |
| MySQL | socketTimeout |
毫秒 | jdbc:mysql://h1,h2/db?socketTimeout=10000 |
| Oracle | oracle.jdbc.ReadTimeout |
毫秒 | 连接属性单独配置 |
主库不可用时,驱动按 URL 列表自动 fail-over 到同城灾备节点
超时值 ≈ 接口最大 SLA,防止慢查询霸占连接
5 配置模板(YAML)
yaml
spring:
datasource:
jdbc-url: jdbc:postgresql://host1:5432,host2:5432/mydb?socketTimeout=10
username: ${DB_USER}
password: ${DB_PWD}
driver-class-name: org.postgresql.Driver
hikari:
pool-name: HikariCP_master
minimum-idle: 10 # 见公式
maximum-pool-size: 50 # ≤ minIdle × 5
connection-timeout: 3000 # 3 s
validation-timeout: 2000 # 2 s
leak-detection-threshold: 6000 # 6 s
max-lifetime: 900000 # 15 min