2010-08-22 42 views
2

我正在創建一個多線程應用程序。但是,當我有一個連接對象服務於所有線程時,我遇到了很多來自我的應用程序的意外行爲。通過每個線程的新連接實例的連接池(JDBC)

我現在處於兩難的境地。我應該讓每個線程創建,使用和處理自己的連接對象,還是應該使用連接池?

我已嘗試連接池,這使應用程序痛苦淋浴。然而,我的直覺是,如果我讓每個線程創建自己的連接對象,我可能會得到一個「太多的連接」錯誤。

請讓我知道是否有任何方法可以幫助。

問候。

回答

5

不管線程問題,你應該肯定去一個連接池。這將大大提高連接性能。然後到線程問題,這確實是一個主要問題。正常的JDBC習慣用法是獲取關閉所有資源的最短可能範圍。即都應該發生在同一個方法塊中。您所描述的問題症狀確認您沒有正確關閉這些資源。

無論連接是否來自池,總是應該發生關閉。關閉非共享連接將防止數據庫在打開時間過長時超時。關閉聯合連接將實際釋放它回到池並使其可用於下一個租約。

下面是在INSERT的情況下正常JDBC成語的外觀。

public void create(Entity entity) throws SQLException { 
    // Declare. 
    Connection connection = null; 
    PreparedStatement statement = null; 

    try { 
     // Acquire. 
     connection = database.getConnection(); 
     statement = connection.prepareStatement(SQL_CREATE); 

     // Use. 
     statement.setSomeObject(1, entity.getSomeProperty()); 
     // ... 
     statement.executeUpdate(); 
    } finally { 
     // Close. 
     if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} 
     if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} 
    } 
} 
+0

Hi BalusC,謝謝你的迴應。我的線程現在正在處理他們自己的連接對象,關閉他們定義的ResultSet和Statement對象。 這解決了「連接太多」的問題。 – mwangi 2010-08-24 07:01:19

+0

不客氣。不要忘記標記接受的答案。另請參閱http://stackoverflow.com/faq :) – BalusC 2010-08-24 11:08:22

+0

我還通過引入鎖定機制來解決線程問題。我在我的所有線程中引入了自定義啓動,停止,暫停和恢復方法。三個線程只能在給定的時間激活。 - 主要的,「製片人」和「工作人員」。我有很多工人,但有一個「生產者」 這是算法的僞代碼 1.啓動主線程 2.啓動生產者線程 3.開始while-true循環 4.雖然生產者尚未暫停,但主線程睡眠x時間 5.啓動一個工作人員,他將挑選與他/她有關的數據:) 6.工作人員工作時,主線程睡x時間 7.結束while-true循環 – mwangi 2010-09-17 08:39:39