2009-02-09 127 views
16

在MySql的​​的配置參考中,使用autoReconnect屬性時發出警告emptor。我遵循指示,並增加了我的服務器的wait_timeout。由於我使用的DBCP(我正在考慮轉移到c3po閱讀Stackoverflow擊落DBCP後的幾個帖子),可以使用autoReconnectForPools屬性嗎?當在DBCP或任何連接池中啓用時,它實際上做了什麼?MySql連接器/ J中的autoReconnect和autoReconnectForPools有什麼區別?

回答

10

autoReconnect會向客戶端拋出一個SQLException,但會嘗試重新建立連接。

autoReconnectForPools將嘗試在每次執行SQL之前對服務器執行ping操作。

我在過去有很多dbcp的問題,尤其是斷開連接。大部分通過轉向c3p0解決。注意mysql驅動程序有c3p0的連接測試器(com.mysql.jdbc.integration.c3p0.MysqlConnectionTester)。

此外,你可能想看看這個:Connection pooling options with JDBC: DBCP vs C3P0

+0

謝謝你的想法。 – ashitaka 2009-04-03 01:44:34

1

你確定你使用正確DBCP?

根據short configuration notes,由於默認值爲testOnBorrow=true(在使用前測試連接,並且如果失敗,它會從池中刪除,我們嘗試獲取新連接),因此應該處理超時時間相當不錯。 。

您需要做的唯一事情是確保您將validationQuery屬性配置爲非空字符串,例如, MySQL數據庫的「SELECT 0」(here是關於每個DB使用的不同validationQuery值的文章)。

5

MySQL的autoReconnect功能被棄用,因爲它有很多問題(參考:官方documentation)。

autoReconnectForPools有一點做與autoReconnect,它更多的是與autoCommitreconnectAtTxEnd - 當所有3 true,它將ping服務器在每次交易結束,如果需要,自動重新連接。

DBCP的連接驗證是不完美的 - 即使設置了testOnBorrow,它有時會從池中返回斷開的連接(更不用說在每次借用之前測試連接都非常低效)。

根據this article,HikariCP似乎是一個更好的池實現,因爲它能夠使用比運行測試查詢快得多的API,並且專門設計爲永不返回到客戶端應用程序的斷開連接。

相關問題