點(diǎn)擊網(wǎng)站二次感染即將大爆發(fā)
在使用Spring Boot結(jié)合Druid連接池時(shí),開發(fā)者可能會(huì)遇到"discard long time none received connection"的警告信息。雖然這通常不會(huì)影響應(yīng)用程序的正常運(yùn)行,但這些警告信息可能會(huì)讓人感到困擾。本文將探討這個(gè)問題的原因,并提供幾種解決方法。
問題現(xiàn)象
在使用Druid連接池的新版本(如1.2.5)時(shí),控制臺(tái)可能會(huì)時(shí)不時(shí)打印以下警告:
WARN com.alibaba.druid.pool.DruidAbstractDataSource - discard long time none received connection. , jdbcUrl : [your-jdbc-url]
這表明Druid連接池檢測到某些數(shù)據(jù)庫連接已經(jīng)超過了一定時(shí)間沒有活動(dòng),因此被標(biāo)記為長時(shí)間空閑并被丟棄。
產(chǎn)生原因
經(jīng)過查看Druid的源碼,發(fā)現(xiàn)這個(gè)問題的根源在于Druid連接池對MySQL連接的處理邏輯。在DruidAbstractDataSource
類的testConnectionInternal
方法中,如果連接空閑時(shí)間超過60秒,Druid會(huì)認(rèn)為該連接已經(jīng)不再有效,并將其丟棄。
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的配置,通過設(shè)置druid.mysql.usePingMethod=false
來避免使用MySQL的Ping方法來檢查連接有效性。這可以通過以下兩種方式實(shí)現(xiàn):
-
運(yùn)行時(shí)配置:在運(yùn)行參數(shù)中增加
-Ddruid.mysql.usePingMethod=false
。 -
Spring配置:在Spring的配置文件中添加:
spring:
datasource:
druid:
mysql:
usePingMethod: false
2. 調(diào)整數(shù)據(jù)庫配置
另一種方法是調(diào)整數(shù)據(jù)庫的配置,例如MySQL的wait_timeout
參數(shù),以增加數(shù)據(jù)庫端的空閑超時(shí)時(shí)間,從而減少因?yàn)閿?shù)據(jù)庫端關(guān)閉連接而導(dǎo)致Druid報(bào)錯(cuò)的情況。
3. 代碼層面的優(yōu)化
最后,確保應(yīng)用程序在使用數(shù)據(jù)庫連接時(shí),能夠及時(shí)釋放資源,避免不必要的連接泄露。
結(jié)語
雖然"discard long time none received connection"的警告可能不會(huì)直接影響應(yīng)用程序的運(yùn)行,但解決這個(gè)問題可以提高應(yīng)用程序的穩(wěn)定性,并減少不必要的資源浪費(fèi)。希望本文提供的方法能夠幫助你解決這個(gè)問題。