在控制台日志中观察到以下报错:

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秒),主动丢弃了该连接。


原因分析

此问题的核心原因是 数据库连接闲置时间过长,可能由以下场景触发:

  1. MySQL服务端超时断开
    MySQL默认配置了wait_timeout参数(通常为8小时),若连接在超时时间内未被使用,服务端会主动断开连接。
    Druid连接池未及时检测到连接失效,导致后续尝试使用此连接时抛出异常。

  2. Druid连接池保活机制缺失

    • 未配置连接有效性检查(如心跳检测)。
    • 未设置合理的连接回收策略(如最小空闲时间)。
  3. 应用层连接泄漏
    某些代码未正确释放连接(如未关闭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` 可查看连接池详情。
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐