在使用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"的警告可能不会直接影响应用程序的运行,但解决这个问题可以提高应用程序的稳定性,并减少不必要的资源浪费。希望本文提供的方法能够帮助你解决这个问题。
到此这篇关于解决spring boot中druid连接池“discard long time none received connection“警告的文章就介绍到这了,更多相关spring boot druid连接池警告内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论