学完这篇你能得到:搞清连接池到底解决了什么问题,以及 HikariCP 和 Druid 各自该在什么场景下用、关键参数怎么配才不踩雷。
第一步:先搞明白连接池在解决什么
每次 DriverManager.getConnection() 都是一次完整的 TCP 三次握手 + 数据库认证 + 权限加载,耗时通常在几毫秒到几十毫秒。高并发下这部分开销会直接压在请求链路上,而且数据库端 max_connections 是硬上限,裸连很容易把库打满。
连接池做的就是「预创建 + 复用 + 归还」:启动时建好一批物理连接放进容器,业务线程借出、用完归还,归还时不真正关闭,而是放回容器等下一个线程复用。围绕这个模型,所有池子都有五个核心参数:
- 最小/初始连接数:池子保底留多少
- 最大连接数:上限,超过就排队或报错
- 获取超时:排队多久拿不到连接就抛异常
- 空闲回收:连接空闲多久被物理关闭
- 保活/校验:定期发一条轻量 SQL 确认连接没被数据库单方面掐断
第二步:HikariCP 的定位与配置
HikariCP 是 Spring Boot 2.x 之后的默认连接池,特点是代码量小、路径短:用 Javassist 动态生成字节码代理来减少方法调用开销,内部用无锁的 ConcurrentBag 管理连接,正常情况下借还连接几乎无锁竞争。它只专注「快」,不提供监控页面这类附加功能。
Spring Boot 里的配置(application.yml):
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 3000
idle-timeout: 600000
max-lifetime: 1200000
keepalive-time: 300000
leak-detection-threshold: 20000
参数含义:connection-timeout 是借连接的最长等待,最小 250ms;max-lifetime 是连接的最长存活时间,到点强制重建;keepalive-time 是保活探测间隔;leak-detection-threshold 是「借出超过 20 秒没归还」就打印堆栈,专门用来抓忘记关连接的代码。
注意:一旦配置了 max-lifetime,就必须保证它比数据库端的空闲超时(MySQL 的 wait_timeout、云数据库常见的 60s/300s)更短,否则会出现「池子里以为连接还活着、实际已被服务端断开」的 Communications link failure。用 JDBC4 驱动时不要画蛇添足配 connection-test-query,驱动自带 isValid() 检测。
第三步:Druid 的定位与配置
Druid 是阿里的开源连接池,除了池化本身,还内置了 SQL 统计、慢 SQL 记录、SQL 防火墙、连接泄漏回收、密码加密(ConfigFilter)等运维能力。代价是组件更多、配置项更细,性能上略逊于 HikariCP,但对绝大多数业务系统完全够用。
spring:
datasource:
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 3000
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
filters: stat,wall,slf4j
stat-view-servlet:
enabled: true
login-username: admin
login-password: 换成强密码
allow: 127.0.0.1
filters 里 stat 开统计、wall 开 SQL 防火墙、slf4j 把 SQL 走日志框架输出。配好后访问 /druid/index.html 就能看到 SQL 执行次数、耗时分布、慢 SQL 排行、活跃连接数曲线。
注意:Druid 监控页会暴露全部 SQL 语句和表结构,绝对不能裸奔在公网。务必用 stat-view-servlet 的账号密码 + allow 白名单双重限制,生产环境建议只允许内网或跳板机 IP。同时保持 Druid 版本更新,旧版本存在安全公告。
第四步:怎么选
简单判断:
- 项目基于 Spring Boot、只要一个稳定够快的连接池 → HikariCP,默认就是它,几乎不用配
- 需要 SQL 监控面板、慢 SQL 排查、SQL 防火墙、数据库密码加密 → Druid
- 两者都支持 Spring Boot 自动装配,切换只需换依赖和配置前缀,成本很低
第五步:三个通用避坑点
- 最大连接数不是越大越好。连接数超过数据库 CPU 处理能力后,多出来的连接只在做上下文切换。经验起点是
(CPU 核心数 × 2) + 有效磁盘数,再压测微调。
- 泄漏检测和慢 SQL 日志有性能开销,只在排查期开启,定位完就关掉。
- 回收策略慎用。Druid 的
remove-abandoned 会把超时未归还的连接强行回收,如果业务确实有长事务,会被误杀,先确认业务里没有超过阈值的慢查询再启用。
小结
- 连接池本质是复用物理连接,减少握手和认证开销,同时把并发压在数据库能承受的范围内
- HikariCP 走「极致轻快」路线,是 Spring Boot 默认,配置重点是
maximum-pool-size、max-lifetime、connection-timeout
- Druid 走「池 + 运维」路线,配置重点是
max-active、filters、stat-view-servlet
- 最关键的一条:连接池的
max-lifetime / 保活间隔必须小于数据库端空闲超时,否则会周期性报连接断开
- 监控页面和泄漏检测都是双刃剑,用完记得收