2010-02-19 17 views
11

我在Java中有一個JDBC MySQL連接。我的程序工作正常,簡單的查詢執行。運行時JDBC程序中的MySQLNonTransientConnectionException

如果我在10個小時以上相同程序並執行一個查詢,然後我收到以下MySQL的例外:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
Connection.close() has already been called. Invalid operation in 
this state. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
    Native Method) 
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
    No operations allowed after statement closed. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(
    Native Method) 

我沒有用過close()方法的任何地方。我創建了數據庫連接並永遠打開它並始終執行查詢。我沒有明確提到連接超時的地方。我無法確定問題。

這裏是我使用的數據庫連接的代碼:

String driver = PropertyReader.getDriver(); 
String url = dbURLPath; 
Class.forName(driver); 
connectToServerDB = DriverManager.getConnection(url); 
connectToServerDB.setAutoCommit(false); 

是什麼原因導致的異常?

回答

5

您必須對配置文件進行更改或增加數據庫的超時期限。如果數據庫空閒超過8小時,則默認關閉。

謝謝

23

MySQL在8小時超時後終止連接。您可以通過在MySQL中設置wait_timeout變量來修改超時。

然而,對於一個應用程序來說,持續這麼長時間的連接通常不是一個好主意。更好的方法是使用池化API(如Apache DBCP)設置連接池,並從池中檢索連接,而不是直接通過驅動程序進行連接。如果連接池由於某些原因(包括超時)而死亡,連接池也將重新建立池連接。

2

我也面臨同樣的問題。這是因爲mysql連接超時,通常它不是一個很好的做法,可以擴展mysql中的超時,因爲它可以用於許多其他應用程序。在超時時重新連接數據庫(即發生此異常)或者使用一些開源庫進行連接池(如Apache DBCP),建議使用@slava。 ORM框架在默認情況下處理這個問題。乾杯!!