[英]Java + Oracle ORA-1000 Maximum open cursors exceeded
我有一個多線程應用程序,其中主線程創建了幾個線程並將其交給ExecutorService。 所有線程在主類中使用Oracle數據庫連接對象。 數據庫連接一次打開,其他線程中的所有方法都使用主數據庫對象。
但是,一旦應用程序開始運行並處理記錄,我看到打開的游標數量一直增加到2000年(我在Oracle中設置了此限制),然后導致ORA-1000消息直到我重新啟動應用程序后才消失。 我正在關閉所有方法以及語句的結果集,並且無法弄清為什么游標數量沒有減少(即使當我運行單個線程時)
這是一種方法:
private boolean GetPending()
{
try {
String statement = "SELECT * FROM PENDING_REQUESTS WHERE REQUEST_ID = GET_PENDING()";
PreparedStatement query = DbConnection.prepareStatement(statement);
ResultSet rs = query.executeQuery();
while (rs.next()) {
MSISDN = rs.getInt(3);
SHORTCODE = rs.getInt(4);
MESSAGE = rs.getString(5);
return true;
}
rs.close();
query.close();
}
catch(SQLException e) {
LogWriter.Log("ID:"+ID+"\t\tError returning field: " + e.toString());
}
return false;
}
我還注意到,如果在發生錯誤時釋放連接,則會釋放游標。 但是,我不想為每個新請求創建一個新連接,因為它會減慢整個應用程序的速度。
任何幫助表示贊賞。 謝謝
那里的幾個問題:
您沒有關閉連接。 finally
關閉您的連接。
您沒有關閉rs或查詢(+1 immibis)
您是否考慮過使用Spring jdbc模板? 還要檢查連接池。 他們是你的朋友。
您需要關閉resultSet和prepared語句。 在您的代碼中未完成。 最好的方法是在最終塊中執行此操作,因此即使發生異常,resultSet也已正確關閉,或者如果您使用java7,請使用try-with-resources
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.