解决Spring Boot中Druid连接池“discard long time none received connecti ...

打印 上一主题 下一主题

主题 1034|帖子 1034|积分 3102

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

在利用Druid连接池的新版本(如1.2.5)时,控制台可能会时不时打印以下警告:
  1. WARN  com.alibaba.druid.pool.DruidAbstractDataSource - discard long time none received connection. , jdbcUrl : [your-jdbc-url]
复制代码
这表明Druid连接池检测到某些数据库连接已经高出了肯定时间没有活动,因此被标记为长时间空闲并被丢弃。
产生原因

经过检察Druid的源码,发现这个问题的根源在于Druid连接池对MySQL连接的处置惩罚逻辑。在DruidAbstractDataSource类的testConnectionInternal方法中,如果连接空闲时间高出60秒,Druid会认为该连接已经不再有效,并将其丢弃。
  1. if (valid && isMySql) {
  2.     long lastPacketReceivedTimeMs = MySqlUtils.getLastPacketReceivedTimeMs(conn);
  3.     if (lastPacketReceivedTimeMs > 0 &&
  4.         mysqlIdleMillis >= timeBetweenEvictionRunsMillis) {
  5.         discardConnection(holder);
  6.         LOG.warn("discard long time none received connection. " +
  7.                  ", jdbcUrl : " + jdbcUrl + ", version : " + VERSION.getVersionNumber() +
  8.                  ", lastPacketReceivedIdleMillis : " + mysqlIdleMillis);
  9.         return false;
  10.     }
  11. }
复制代码
解决办法

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"的警告可能不会直接影相应用步伐的运行,但解决这个问题可以进步应用步伐的稳定性,并减少不必要的资源浪费。希望本文提供的方法能够资助你解决这个问题。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表