彼時的少年站在成長的盡頭,回首過去,一路崎嶇早已繁花盛開
druid
是一個用于 Java 的高效數(shù)據(jù)庫連接池,它提供了強大的監(jiān)控和擴展功能。
空閑等待超時
Caused by:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:The last packet successfully received from the server was 65,699,330 milliseconds ago. The last packet sent successfully to the server was 65,699,330 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
mysql數(shù)據(jù)庫等待超時時間(wait_timeout)是28800,也就是8小時,而druid連接池參數(shù)max-wait是30000
連接空閑超時問題的原因通常與連接池和數(shù)據(jù)庫服務器之間的配置不匹配有關(guān)。當連接池中的連接長時間處于空閑狀態(tài)時,數(shù)據(jù)庫服務器可能會關(guān)閉這些空閑連接以節(jié)省資源。這種情況下,連接池可能仍然認為這些連接是有效的,但實際上數(shù)據(jù)庫服務器已經(jīng)釋放了它們。
以下是引發(fā)連接空閑超時問題的一些可能原因:
-
服務器端的
wait_timeout
設置較低:數(shù)據(jù)庫服務器會在連接空閑一段時間后關(guān)閉它們。如果服務器的wait_timeout
參數(shù)設置得較低,連接池中的空閑連接可能在被使用前就已被服務器關(guān)閉。 -
連接池配置不合理:如果連接池的配置參數(shù)(例如
maxIdle
和minEvictableIdleTimeMillis
)沒有合理設置,連接池可能會保持過多的空閑連接,導致它們在被使用前被數(shù)據(jù)庫服務器關(guān)閉。 -
連接池沒有檢查連接有效性:如果連接池在獲取連接時沒有進行有效性檢查(例如沒有啟用
testOnBorrow
和設置validationQuery
),則可能會將已被數(shù)據(jù)庫服務器關(guān)閉的連接分配給應用程序,從而導致通信問題。
解決這個問題的關(guān)鍵是確保連接池和數(shù)據(jù)庫服務器之間的配置相互協(xié)調(diào)。可以通過調(diào)整連接池和數(shù)據(jù)庫服務器的相關(guān)參數(shù)以及啟用連接有效性檢查來解決連接空閑超時問題。
解決方案
這個錯誤表明在使用數(shù)據(jù)庫連接時出現(xiàn)了通信問題。從錯誤日志來看,連接在一段時間內(nèi)沒有收到或發(fā)送任何數(shù)據(jù)包,超過了服務器配置的 wait_timeout
值。這可能是因為連接長時間處于空閑狀態(tài),而 MySQL 服務器端的 wait_timeout
參數(shù)設置為 8 小時(28,800 秒)。
為了解決這個問題,可以嘗試以下幾個方法:
- 在 druid 連接池中配置
testOnBorrow
參數(shù),將其設置為true
。這將在從連接池獲取連接時檢查連接的有效性。另外,你需要配置validationQuery
參數(shù),以便在獲取連接時執(zhí)行一個簡單的 SQL 查詢以測試連接的有效性。例如,對于 MySQL,可以設置validationQuery
為SELECT 1
。
druid:
testOnBorrow: true
validationQuery: SELECT 1
- 調(diào)整 druid 連接池的
maxIdle
和minEvictableIdleTimeMillis
參數(shù)。maxIdle
參數(shù)用于設置連接池中允許的最大空閑連接數(shù),minEvictableIdleTimeMillis
參數(shù)表示一個連接空閑多長時間后將被清除或回收。這可以防止長時間未使用的連接被 MySQL 服務器關(guān)閉。
druid:
maxIdle: <設置最大空閑連接數(shù)>
minEvictableIdleTimeMillis: <設置空閑連接的最小可驅(qū)逐時間(毫秒)>
-
在 MySQL 服務器端增加
wait_timeout
參數(shù)的值。這將允許連接在空閑狀態(tài)下保持更長的時間。然而,需要注意的是,這可能會導致服務器資源占用較高,因此請根據(jù)實際情況進行調(diào)整。 -
在連接 MySQL 數(shù)據(jù)庫時,使用 Connector/J 驅(qū)動的
autoReconnect=true
屬性。這樣在連接斷開后,驅(qū)動程序會嘗試自動重新連接。需要注意的是,這種方法可能會隱藏一些潛在的問題,因此在使用前要仔細權(quán)衡利弊。
jdbc:mysql://<hostname>:<port>/<database>?autoReconnect=true
嘗試根據(jù)上述方法調(diào)整 druid 連接池和 MySQL 服務器的配置,以解決這個通信問題。
網(wǎng)上很多人都是把max-wait設置的小點, 例如 10000, 然后解決的, 這真的可以解決這個問題嗎?
maxWait
參數(shù)并不是用來表示連接池持有數(shù)據(jù)庫連接空閑也依舊占用多長時間的意思。實際上,maxWait
是 Druid 連接池配置中的一個參數(shù),表示從連接池中獲取連接時的最大等待時間。
當一個線程需要從連接池獲取一個連接時,如果連接池中沒有可用的連接,該線程會等待。maxWait
參數(shù)用于指定等待的最大時間(以毫秒為單位)。如果在 maxWait
所設置的時間內(nèi)仍然無法獲取到可用的連接,那么該線程將拋出一個異常。這可以防止線程因為等待連接而長時間阻塞。
另一方面,關(guān)于連接池持有數(shù)據(jù)庫連接空閑依舊占用的時間,你可以查看 minEvictableIdleTimeMillis
參數(shù)。這個參數(shù)表示連接空閑多長時間后會被清除或回收。通過設置這個參數(shù),你可以控制連接池中連接的最小空閑時間。
將 max-wait
設置得較?。ɡ?10,000 毫秒)并不能直接解決這個問題。實際上,減小 max-wait
只是減少了等待從連接池中獲取連接的時間,但并不能解決連接空閑超時的根本問題。
將 max-wait
設置得較小可能會減輕問題的表面現(xiàn)象,因為在高并發(fā)場景下,等待時間較短可能會使得連接更快地被分配給其他線程,從而減少單個連接空閑的時間。然而,這并不能保證在低負載情況下連接不會長時間保持空閑狀態(tài)。
為了解決這個問題,建議采用前面提到的方法,例如:
- 使用
testOnBorrow
和validationQuery
參數(shù)來檢查從連接池獲取的連接的有效性。 - 調(diào)整
maxIdle
和minEvictableIdleTimeMillis
參數(shù),以便更好地管理連接池中的空閑連接。 - 調(diào)整 MySQL 服務器的
wait_timeout
參數(shù),使其允許連接在空閑狀態(tài)下保持更長的時間。 - 在連接字符串中添加
autoReconnect=true
,以便在連接斷開時嘗試自動重新連接。
這些方法可以更有效地解決連接空閑超時的問題。
網(wǎng)上有人說testOnReturn和testOnBorrow都為false時性能最好, 是這樣的嗎?
當 testOnReturn
和 testOnBorrow
都設置為 false
時,性能可能會有所提升。這是因為在這種情況下,連接池不會在歸還或獲取連接時執(zhí)行額外的有效性檢查。這樣可以減少一些開銷,從而提高性能。
然而,并非所有情況下都適合將這兩個參數(shù)設置為 false
。例如,在你之前提到的問題中,由于連接空閑超時導致的通信問題,這種情況下,將 testOnBorrow
設置為 true
可以幫助檢查連接的有效性,從而避免因為使用無效連接而導致的問題。
在實際應用中,需要根據(jù)具體場景和需求來決定是否啟用這些參數(shù)。如果數(shù)據(jù)庫服務器和連接池的配置良好,并且連接穩(wěn)定性較高,可以考慮將這些參數(shù)設置為 false
以提高性能。然而,如果連接穩(wěn)定性存在問題,或者需要確保連接的有效性,那么啟用這些參數(shù)可能是更好的選擇。文章來源:http://www.zghlxwxcb.cn/news/detail-472628.html
總之,在實際應用中,需要權(quán)衡性能和穩(wěn)定性,根據(jù)具體情況選擇合適的參數(shù)配置。文章來源地址http://www.zghlxwxcb.cn/news/detail-472628.html
到了這里,關(guān)于druid之連接空閑超時問題FIX的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!