不管線程問題,你應該肯定去一個連接池。這將大大提高連接性能。然後到線程問題,這確實是一個主要問題。正常的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) {}
}
}
Hi BalusC,謝謝你的迴應。我的線程現在正在處理他們自己的連接對象,關閉他們定義的ResultSet和Statement對象。 這解決了「連接太多」的問題。 – mwangi 2010-08-24 07:01:19
不客氣。不要忘記標記接受的答案。另請參閱http://stackoverflow.com/faq :) – BalusC 2010-08-24 11:08:22
我還通過引入鎖定機制來解決線程問題。我在我的所有線程中引入了自定義啓動,停止,暫停和恢復方法。三個線程只能在給定的時間激活。 - 主要的,「製片人」和「工作人員」。我有很多工人,但有一個「生產者」 這是算法的僞代碼 1.啓動主線程 2.啓動生產者線程 3.開始while-true循環 4.雖然生產者尚未暫停,但主線程睡眠x時間 5.啓動一個工作人員,他將挑選與他/她有關的數據:) 6.工作人員工作時,主線程睡x時間 7.結束while-true循環 – mwangi 2010-09-17 08:39:39