我正在使用java編寫的服務器應用程序。 每秒最多有30個客戶端請求,每個請求都會更新特定的mysql表條目。如何正確管理MySQL連接?
所有服務器線程使用單個mySQL連接,它們從單例類獲得它。然後服務器線程創建一個Statement並執行更新查詢。
雖然我在執行後關閉所有創建的語句,但服務器在幾個小時後停止更新mySQL表。
什麼可能是錯的?這種設置是錯誤的概念嗎?
我正在使用java編寫的服務器應用程序。 每秒最多有30個客戶端請求,每個請求都會更新特定的mysql表條目。如何正確管理MySQL連接?
所有服務器線程使用單個mySQL連接,它們從單例類獲得它。然後服務器線程創建一個Statement並執行更新查詢。
雖然我在執行後關閉所有創建的語句,但服務器在幾個小時後停止更新mySQL表。
什麼可能是錯的?這種設置是錯誤的概念嗎?
也許,您的連接由於超時而被關閉。 您可以使用Connection#isValid以驗證您的連接是否仍處於打開狀態。您可以查看Connection timeout for DriverManager getConnection。列出了幾個好的提示。
此外,您可能會考慮在您的代碼中使用Connection Pool。 Apache commons是一個很好的開始。
謝謝你的回答,連接池似乎是要走的路。 我現在正在尋找一個簡單的例子,因爲我不明白連接池的用法呢... – cutze 2013-05-13 10:06:25
http://www.roseindia.net/tutorial/java/jdbc/jdbcconnectionpooling.html 我想我會嘗試這種方式。將這個線程設置爲單例是否正確,是否在我的主類中啓動並讓所有線程從它們獲得它們的連接? 還有一個問題:連接池應該多大才能達到~30個請求/秒? 不幸的是我還不能測試它,必須等待晚上:) – cutze 2013-05-13 10:15:25
不客氣。它不需要從頭開始實現連接池。有幾種可供選擇的罐子:[C3PO](http://www.mchange.com/projects/c3p0/index.html),[DBCP](http://commons.apache.org/dbcp) – lifus 2013-05-13 10:15:56
您可以查看http://stackoverflow.com/questions/1683949/connection-timeout-for-drivermanager-getconnection。您也可以實現或[重新使用](http://commons.apache.org/proper/commons-pool/)[連接池](http://en.wikipedia.org/wiki/Connection_pooll)來管理您的連接's – lifus 2013-05-13 09:23:57