解决Druid连接池报错“discard long time none received connection”的完整指南
在控制台日志中观察到以下报错:
loglog 2025-02-14 10:38:13.738 ERROR 11324 --- [nio-7777-exec-7] c.a.druid.pool.DruidAbstractDataSource : discard long time none received connection. , jdbcUrl : jdbc:mysql://localhost:3306/lyt, lastPacketReceivedIdleMillis : 698462
该报错表示 Druid连接池检测到某个数据库连接长时间未被使用(约698秒),主动丢弃了该连接。
原因分析
此问题的核心原因是 数据库连接闲置时间过长,可能由以下场景触发:
-
MySQL服务端超时断开
MySQL默认配置了wait_timeout参数(通常为8小时),若连接在超时时间内未被使用,服务端会主动断开连接。
Druid连接池未及时检测到连接失效,导致后续尝试使用此连接时抛出异常。 -
Druid连接池保活机制缺失
- 未配置连接有效性检查(如心跳检测)。
- 未设置合理的连接回收策略(如最小空闲时间)。
-
应用层连接泄漏
某些代码未正确释放连接(如未关闭ResultSet、Statement或Connection),导致连接长期占用。
解决方案
1. 配置Druid连接池保活机制
在application.yml 中添加以下配置,启用心跳检测和连接回收策略:
yyaml spring: datasource: druid: # 基本连接配置 url: jdbc:mysql://localhost:3306/lyt username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver
# 连接池保活配置
testWhileIdle: true # 开启空闲连接检查
validationQuery: SELECT 1 # MySQL心跳检测语句
timeBetweenEvictionRunsMillis: 60000 # 检查空闲连接的间隔(60秒)
minEvictableIdleTimeMillis: 300000 # 连接最小空闲时间(300秒)
testOnBorrow: true # 借出连接时校验有效性
##### **2. 禁用Druid的Ping探测(可选)**
某些MySQL驱动版本与Druid的Ping探测不兼容,可在启动参数或配置中关闭:
yyaml
# 方式1:Spring配置
spring:
datasource:
druid:
mysql:
usePingMethod: false
# 方式2:JVM启动参数
java -jar -Ddruid.mysql.usePingMethod=false your-app.jar
3. 调整MySQL服务端超时时间
修改MySQL配置文件(my.cnf 或my.ini ),延长连接超时阈值:
iniini [mysqld] wait_timeout = 86400 # 闲置超时时间(默认8小时,调整为24小时) interactive_timeout = 86400 # 交互会话超时时间
##### **4. 检查代码中的连接泄漏**
确保所有数据库操作后正确关闭资源(推荐使用`try-with-resources`):
// Java示例:自动关闭Connection、Statement、ResultSet
try (Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM user")) {
// 处理结果集
} catch (SQLException e) {
log.error(" 数据库操作异常", e);
}
5. 启用Druid监控功能
通过Druid内置的监控界面,实时查看连接池状态和SQL执行情况:
访问 `http://localhost:8080/druid` 可查看连接池详情。
更多推荐
所有评论(0)