簡體   English   中英

Java + Oracle ORA-1000超過最大打開游標

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM