點擊網站二次感染即將大爆發(fā)
在使用Spring Boot結合Druid連接池時,開發(fā)者可能會遇到"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的源碼,發(fā)現這個問題的根源在于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. 代碼層面的優(yōu)化
最后,確保應用程序在使用數據庫連接時,能夠及時釋放資源,避免不必要的連接泄露。
結語
雖然"discard long time none received connection"的警告可能不會直接影響應用程序的運行,但解決這個問題可以提高應用程序的穩(wěn)定性,并減少不必要的資源浪費。希望本文提供的方法能夠幫助你解決這個問題。