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

結果セットを閉じた後、Oracleはカーソルを削除しません

    init.oraパラメータopen_cursors セッションが一度に持つことができる開いたカーソルの最大数を定義します。デフォルト値は50です。アプリケーションがこの数値を超えると、「ORA-01000:開いているカーソルの最大数を超えました」というエラーが発生します。

    したがって、JDBCリソース、特にjava.sql.ResultSetおよびjava.sql.Statementが不要になった場合は、JDBCリソースを閉じる必要があります。それらが閉じられていない場合、アプリケーションにリソースリークがあります。

    Connectionオブジェクトを再利用する場合は、接続が存在する限り、開いているOracleカーソルが開いたままで使用されていることに注意する必要があります トランザクションは終了していません。アプリケーションがコミットすると、開いているカーソルが解放されます。

    したがって、アプリケーション設計者は、最も複雑なトランザクションに必要なオープンカーソルの概算を知る必要があります。

    問題は、Oracleの内部パラメータビュー(v $ open_cursor、v $ sesstatなど)が、再利用可能な開いたカーソルと、まだブロックされている(再利用できない!)開いたカーソルの違いを表示できないことにあります。閉じられていないResulSetまたはステートメント。 finallyブロック内のすべてのStatementオブジェクトとResultSetオブジェクトを閉じると、アプリケーションは完全に正常になります。

    init.oraパラメータの調整は次のように機能します(アプリケーションには最大800個のカーソルが必要です)

    ALTER SYSTEM SET open_cursors = 800 SCOPE=BOTH;
    


    1. SQLite-JOINステートメント

    2. Oracleクライアントのインストールエラー-パスが長すぎます

    3. SSMSでストアドプロシージャの結果セットをExcelにエクスポートする

    4. フラグメントでAndroidSqliteデータベースを開く