2013-08-23 47 views
3

好吧。我最近剛剛得出這個結論。訪問數據庫時是否有時間限制?更準確地說,MySQL數據庫是通過MySQL提供的JDBC和驅動程序訪問的?訪問數據庫時是否有時間限制?那麼,

要知道更精確地發生什麼,我給你更多的細節:

所以我有一個網站,實際上提供RESTful Web服務,它也支持與凱蒂 - 緩存緩存,因爲一些計算是做昂貴。我運行該項目,並從瀏覽器訪問所有api地址,一切正常。

奇怪的是,當我沒有關閉我的電腦,今天我再次訪問,與數據庫(MySQL)有關的地址只是錯誤,內部服務器錯誤,並且錯誤是由NullPointerException引起的它不應該發生。我停止了該項目,再次運行它,訪問相同的地址,並顯示了數據。

有沒有時間限制?我們如何刷新數據庫連接?我想我會嘗試重新連接它,但我不知道如何。

代碼:

java.sql.Connection conn = null; 

try { 
    Class.forName("com.mysql.jdbc.Driver"); 
    String conStr = 
     "jdbc:mysql://" + this.dbHostname + 
     ":" + this.dbPort + "/" + this.dbName; 
    conn = DriverManager.getConnection(conStr, this.dbUsername, this.dbPassword); 
    this.isConnectingSuccess = true; 
} catch (ClassNotFoundException cnfe) { 
    throw new IllegalDbCmdExecution(cnfe.getMessage()); 
} catch (SQLException sqle) { 
    throw new IllegalDbCmdExecution(sqle.getMessage()); 
} 
+0

你能告訴我們一些代碼,或至少jdbc聲明? – KernelPanic

+0

閱讀關於JDBC的autoReconnect和wait_timeout屬性。將autoReconnect設置爲true和/或將wait_timeout從默認的8小時增加到更多應該有所幫助。 – yetanotherse

+0

這也將與您連接到數據庫的方式有關。但是,是的,我會懷疑有一個非活動連接超時 – MadProgrammer

回答

-1

退房的wait_timeout參數的my.ini並檢查interactive_timeout

+0

我不想修改任何默認值,我想我寧願保留8小時。只有當有一個SQL請求,而不是連接時,我想手動重新建立連接。 –

+0

使用'timer'或'thread'來檢查'con == null'是否爲'con == null'。如果它是'null',則重新建立連接。 –

0

嘛。我設法解決這個問題。我所做的是,以前當我想查詢數據庫時,我調用execute()方法。現在,execute()方法是final方法:

public final void execute() { 
    preExecuting(); 
    executing(); 
    postExecuting(); 
} 

然後我宣佈preExecuting和postExecuting爲無效的方法,當然,重寫:

public void preExecuting() { } 
public void postExecuting() { } 

,然後執行抽象方法,因而,這種方法實現的問題:

public abstract void executing(); 

所以,以後我需要做一些與執行,這實際上削減代碼前面的execute()這個方法執行。在進一步的類中,我用代碼重寫preExecuting以通過執行「SELECT 1」來測試連接,並測試它是否引發SQLException。如果是,那麼我需要重新建立連接。

就這麼簡單。 :)