0

我正在Java中使用SpringFramework在使用JdbcTemplate類的Mysql Server上進行數據庫編程。如何正確處理連接空閒超時錯誤

使用org.apache.commons.dbcp.BasicDataSource作爲db數據源。

有時,當連接閒置時間長,CommunicationException被拋出以下消息:

The last packet successfully received from the server was XXXXX milliseconds ago. 

我不想加入autoReconnect的參數來連接來處理這個問題,或者添加該屬性將在每個查詢之前執行select 1以確保連接正確打開。我也不想觸摸mysql服務器的配置,並提高超時值。

我想要做的是正確處理該異常。

我想過要抓住CommunicationException,只是重試,直到成功,如果失敗多了X次,然後拋出一個異常,表明重試X次失敗。

  • 沒有人有任何其他想法如何處理這個問題?
  • 我的想法如何? :)
  • 也許有一些東西在春天框架中爲我自動做到這一點,我錯過了它?

任何信息將不勝感激。

謝謝!

+0

爲什麼你不想使用autoReconnect? – EJP

+0

我讀到autoReconnect參數已被棄用 – ufk

+1

「不建議使用autoReconnect選項,因爲沒有安全的方法重新連接到MySQL服務器,而不會冒損壞連接狀態或數據庫狀態信息的風險,相反,您應該使用連接池,它將使您的應用程序能夠使用池中的可用連接連接到MySQL服務器。autoReconnect功能已被棄用,並且可能在未來版本中被刪除。「,來自http://dev.mysql.com/doc /refman/5.1/en/connector-j-usagenotes-troubleshooting.html#qandaitem-21-3-5-3-1-4 – ptomli

回答

1

如果您的查詢可重新啓動,那麼重試可能有意義。我知道我們在地方做到這一點,並且對於奇怪的臨時故障,它工作得很好。我們確實記錄了事件,因爲它確實應該是罕見的。

連接失敗是生活的一部分,應該以不同方式處理連接超時

雖然你應該有處理,你有「牽手」連接失敗,如果你不保持連接的保持時間過長,那麼你也可以看看BasicDataSourcetestOnBorrowtestOnReturn性能理智的方式。這些不一定意味着在每個查詢之前選擇一個測試,除非您在每個查詢之前確實收集了一個句柄。

如果池上有很多連接,並且它們不經常用於停止超時,那麼這實際上是一個配置錯誤。編寫代碼以避免這種情況看起來有點落後。

相關問題