sql >> データベース >  >> RDS >> Oracle

ResultSetを閉じますが、PreparedStatementを閉じません

    リークは最大のオープンカーソルの問題になります。

    ORA-01000: maximum open cursors exceeded
    

    開いているカーソルの最大数を超えると、すでに保持されているカーソルを除いて、データベースは使用できなくなります。ただし、これが発生するほとんどの場合、保持されているカーソルは使用されません(これはあなたの質問の場合です)。

    java 7以降、これを処理する最良の方法は、を使用することです。リソース付き 。両方のResultSet およびPreparedStatement AutoCloseableを実装します インターフェースは、不要になったときに閉じられることを意味します。

    Java 7をお持ちでない場合は、これをfinallyで処理する必要があります。 ブロックしますが、閉じる前にnull値を確認してください。そうしないと、リソースが初期化されなかった場合にNPEが発生する可能性があります。

    ステートメントを閉じると結果セットが自動的に閉じられるため、逆の場合でも問題は発生しないことに注意してください。

    最大値を超える可能性を少なくするために、アプリケーションにより多くのカーソルを簡単に許可できることに注意してください。

    ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;
    

    ただし、ほとんどの場合、最大のオープンカーソルが発生した場合、実際の問題が隠されるだけなので、これは解決策にはなりません。



    1. mySQLを使用したGROUP_CONCAT後のSUMデータ

    2. 1つの行をすべての行に結合し、すべての行を返す

    3. MySQL一時テーブルを作成し、そこからCRUDを割り当てます

    4. デフォルトの権限が原因でPostgreSQLのドロップロールが失敗する