HikariCP高并发下连接泄漏的常见原因
连接泄漏通常由于未正确关闭数据库连接导致。高并发场景下,连接池中的连接被频繁申请但未释放,最终耗尽连接池资源。
配置优化防止连接泄漏
设置合理的连接超时参数
java
HikariConfig config = new HikariConfig();
config.setConnectionTimeout(30000); // 连接获取超时时间(毫秒)
config.setIdleTimeout(600000); // 空闲连接存活时间(毫秒)
config.setMaxLifetime(1800000); // 连接最大存活时间(毫秒)
启用泄漏检测机制
java
config.setLeakDetectionThreshold(60000); // 泄漏检测阈值(毫秒)
代码层最佳实践
使用try-with-resources确保连接关闭
java
try (Connection connection = dataSource.getConnection();
PreparedStatement stmt = connection.prepareStatement(sql)) {
// 执行数据库操作
}
避免在循环中创建连接
java
// 错误示例
for (int i = 0; i < 1000; i++) {
Connection conn = dataSource.getConnection();
// ...
}
// 正确做法
try (Connection conn = dataSource.getConnection()) {
for (int i = 0; i < 1000; i++) {
// 复用同一个连接
}
}
监控与诊断
配置JMX监控
java
config.setRegisterMbeans(true);
查看HikariCP状态日志
properties
logging.level.com.zaxxer.hikari=DEBUG
线程池与连接池的协调
确保业务线程池大小与数据库连接池大小匹配
java
// 线程池大小不应超过连接池最大连接数
int corePoolSize = dataSource.getMaximumPoolSize() * 0.8;
事务管理优化
使用合适的事务隔离级别
java
connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
控制事务范围,避免长事务
java
@Transactional(timeout = 30) // 设置事务超时
public void businessMethod() {
// ...
}
https://www.mscbsc.com/askpro/question.php?qid=272607
https://www.mscbsc.com/askpro/question.php?qid=272605
https://www.mscbsc.com/askpro/question.php?qid=272600