应使用hikaricp连接池替代drivermanager直连,核心是选对池、配准参数(如maximumpoolsize设为数据库max_connections的70%~80%)、严格管理连接生命周期(try-with-resources自动关闭),并配合监控预警。

直接用 DriverManager.getConnection() 每次新建连接,在高并发下会迅速拖垮系统——建立连接耗时长、线程排队严重、数据库容易报 “Too many connections”。真正提升性能的关键,是用连接池把连接“管起来”,核心就三点:选对池、配准参数、管住连接生命周期。
优先用 HikariCP 替代老式连接池
HikariCP 是当前 Java 生态中性能最强、开销最低的 JDBC 连接池。它采用无锁设计(ConcurrentBag),在上千线程争抢连接时仍保持毫秒级响应;代码精简、依赖少,出问题排查快。相比 C3P0 或 DBCP2,它默认配置更合理,上手即用,同等硬件下可支撑更高 TPS。
- Maven 引入(推荐最新稳定版,如 5.0.1):
<dependency><br> <groupid>com.zaxxer</groupid><br> <artifactid>HikariCP</artifactid><br> <version>5.0.1</version><br></dependency>
- 避免使用已停止维护或性能落后的连接池(如早期 DBCP、C3P0),尤其在生产环境。
关键参数必须按场景调优,不能全靠默认值
比如 maximumPoolSize 默认为 10,电商秒杀时几百请求排队等连接,必然超时失败。要结合数据库最大连接数、应用线程模型和压测结果来设。
-
maximumPoolSize:设为数据库
max_connections的 70%~80%,例如 MySQL 设置了 200,则这里设 140~160 -
minimumIdle:保持常驻空闲连接,建议设为
maximumPoolSize的 1/3~1/2,减少突发流量时新建连接开销 - connectionTimeout:获取连接最长等待时间,建议 30000ms(30 秒),太短易抛异常,太长阻塞线程
-
maxLifetime:连接最大存活时间(如 1800000ms = 30 分钟),强制刷新老化连接,防止 MySQL 的
wait_timeout导致通信异常 - leakDetectionThreshold:设为 60000ms(60 秒),自动检测未归还连接,快速定位 Connection 泄露点
代码层面必须严格管理连接生命周期
连接池再好,如果用完不还,等于白搭。泄露一个连接,池子就少一个,累积下来整个服务就卡死。
- 务必使用
try-with-resources自动关闭Connection、Statement、ResultSet - 所有数据库操作必须在
try块内完成,catch中不吞异常,finally不手动close - 事务边界要清晰:开启事务后,必须显式
commit或rollback,否则连接会被长期占用 - 避免在 long-running 线程或定时任务里长期持有
Connection
配合监控持续观察池子健康状态
连接池不是配完就一劳永逸。HikariCP 提供 JMX 和 Metrics 接口,可实时查看:
- 活跃连接数(active)与空闲连接数(idle)是否波动剧烈
- 连接获取平均耗时是否突增(说明有争抢或泄漏)
- 是否有连接被强制回收(
maxLifetime触发)或因超时被丢弃 - 是否频繁触发
leakDetectionThreshold告警
把这些指标接入 Prometheus + Grafana,能提前发现隐患,而不是等用户投诉才介入。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











