解决Spring Boot中Druid连接池“discard long time none received connection“警告

在使用Spring Boot结合Druid连接池时,开发者可能会遇到"discard long time none received connection"的警告信息。虽然这通常不会影响应用程序的正常运行,但这些警告信息可能会让人感到困扰。本文将探讨这个问题的原因,并提供几种解决方法。

问题现象

在使用Druid连接池的新版本(如1.2.5)时,控制台可能会时不时打印以下警告:

复制代码
WARN  com.alibaba.druid.pool.DruidAbstractDataSource - discard long time none received connection. , jdbcUrl : [your-jdbc-url]

这表明Druid连接池检测到某些数据库连接已经超过了一定时间没有活动,因此被标记为长时间空闲并被丢弃。

产生原因

经过查看Druid的源码,发现这个问题的根源在于Druid连接池对MySQL连接的处理逻辑。在DruidAbstractDataSource类的testConnectionInternal方法中,如果连接空闲时间超过60秒,Druid会认为该连接已经不再有效,并将其丢弃。

复制代码
if (valid && isMySql) {
    long lastPacketReceivedTimeMs = MySqlUtils.getLastPacketReceivedTimeMs(conn);
    if (lastPacketReceivedTimeMs > 0 && 
        mysqlIdleMillis >= timeBetweenEvictionRunsMillis) {
        discardConnection(holder);
        LOG.warn("discard long time none received connection. " +
                 ", jdbcUrl : " + jdbcUrl + ", version : " + VERSION.getVersionNumber() +
                 ", lastPacketReceivedIdleMillis : " + mysqlIdleMillis);
        return false;
    }
}

解决办法

1. 修改Druid配置

一种解决方法是修改Druid的配置,通过设置druid.mysql.usePingMethod=false来避免使用MySQL的Ping方法来检查连接有效性。这可以通过以下两种方式实现:

  • 运行时配置 :在运行参数中增加-Ddruid.mysql.usePingMethod=false

  • Spring配置:在Spring的配置文件中添加:

    spring:

    datasource:

    druid:

    mysql:

    usePingMethod: false

2. 调整数据库配置

另一种方法是调整数据库的配置,例如MySQL的wait_timeout参数,以增加数据库端的空闲超时时间,从而减少因为数据库端关闭连接而导致Druid报错的情况。

3. 代码层面的优化

最后,确保应用程序在使用数据库连接时,能够及时释放资源,避免不必要的连接泄露。

结语

虽然"discard long time none received connection"的警告可能不会直接影响应用程序的运行,但解决这个问题可以提高应用程序的稳定性,并减少不必要的资源浪费。希望本文提供的方法能够帮助你解决这个问题。

相关推荐
safestar201215 分钟前
SelectDB JSON字段查询性能优化实战:从踩坑到最佳实践
oracle·性能优化·json
北友舰长17 分钟前
基于Springboot+thymeleaf快递管理系统的设计与实现【Java毕业设计·安装调试·代码讲解】
java·spring boot·mysql·校园管理·快递·快递系统
学网安的肆伍18 分钟前
【039-安全开发篇】JavaEE应用&SpringBoot框架&Actuator监控泄漏&Swagger自动化
spring boot·安全·java-ee
IT_陈寒22 分钟前
Vue3性能优化实战:这5个技巧让我的应用加载速度提升了40%
前端·人工智能·后端
长征coder22 分钟前
SpringCloud服务优雅下线LoadBalancer 缓存配置方案
java·后端·spring
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ31 分钟前
查询MySQL数据库表的结构和数据
数据库·mysql·oracle
ForteScarlet35 分钟前
Kotlin 2.3.0 现已发布!又有什么好东西?
android·开发语言·后端·ios·kotlin
Json____36 分钟前
springboot框架对接物联网,配置TCP协议依赖,与设备通信,让TCP变的如此简单
java·spring boot·后端·tcp/ip
程序员阿明38 分钟前
spring boot 3集成spring security6
spring boot·后端·spring
后端小张38 分钟前
【JAVA 进阶】深入拆解SpringBoot自动配置:从原理到实战的完整指南
java·开发语言·spring boot·后端·spring·spring cloud·springboot