应使用连接池(如HikariCP)替代循环内直接调用DriverManager.getConnection(),预建连接、借还复用,避免重复握手开销;配置全局DataSource,循环中用try-with-resources获取并自动归还连接,禁用直连,监控连接状态防泄漏。

直接在循环里调用 DriverManager.getConnection() 创建连接,是典型的性能陷阱。每次创建连接都要走 TCP 三次握手、身份认证、会话初始化,平均耗时 50~100ms;100 次循环就是几秒卡顿,高并发下还可能拖垮数据库。
用连接池统一管理连接生命周期
连接池(如 HikariCP)在应用启动时就预建好一批连接,循环中只需“借”和“还”,不新建也不真关闭:
- 配置一个全局的
HikariDataSource实例,复用整个应用生命周期 - 循环内调用
dataSource.getConnection()获取连接——这一步极快(微秒级) - 用完必须调用
connection.close()——注意:这不是关闭,而是归还到池中 - 避免把
dataSource创建写在循环里,否则等于“为每次循环新建一个池”
把连接提取到循环外部
如果循环逻辑本身不涉及并发或事务隔离,最简单有效的方式是:只创建一次连接,在循环中重复使用(前提是业务允许):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 连接复用可大幅降低开销,尤其适合批量查/插/更新同一张表
- 记得显式控制事务边界:开启事务 → 循环操作 → 统一提交/回滚 → 最后归还连接
- 不要在循环里反复
conn.createStatement()或conn.prepareStatement(),可提前创建并复用PreparedStatement
用 try-with-resources 确保连接及时归还
即使在循环内部获取连接,也要靠语法保障资源释放,防止连接泄露:
立即学习“Java免费学习笔记(深入)”;
-
try (Connection conn = dataSource.getConnection()) { ... }能自动触发close() - 比手写
finally块更可靠,避免因异常跳过归还逻辑 - 若循环体较大,建议把单次数据库操作封装成独立方法,每个方法内管好自己的连接
检查连接是否真的被复用
光配了连接池还不够,得确认代码没绕过它:
- 禁用所有
DriverManager.getConnection()的直接调用,全部走DataSource - 检查日志或监控指标:HikariCP 的
activeConnections和idleConnections是否稳定,而不是持续飙升 - 开启 HikariCP 的
leakDetectionThreshold(如 60000ms),能捕获忘记归还连接的问题

















