Java コードでループを使用して、データベースに行を挿入しています。次に、エラーが発生しました-
ORA-01000: maximum open cursors exceeded
少し検索したところ、各行を追加した後に準備済みのステートメントまたはステートメントを閉じると、エラーを取り除くのに役立つことがわかりました。
しかし、私は理解する必要があります -
- カーソルとは
- カーソルの数を変更できますか? はいの場合、それは良いことですか?
このリンクでは、カーソルとは何か、どのように機能するかについて説明します。
はい、次のステートメントを使用して、Oracle のカーソルの最大数を変更できます。
ALTER SYSTEM SET OPEN_CURSORS=1337 SID='*' SCOPE=BOTH;
ただし、本当に必要な場合にのみ行う必要があります。本当にすべきことは、結果セットとステートメントを正しく処理し、常にそれらを閉じるようにすることです。try/finally
これは通常、ステートメントで行う必要があります。
これらを閉じるのを忘れると、最大制限に達するまで開いているカーソルがリークし (非常に速くなります)、その後の要求は機能しません (これはあなたの場合です)。
質問を編集してコードを追加すると、結果セットとステートメントを適切に閉じる方法と場所についてのヒントを示すことができます。
これは典型的な使い方です:
Statement stmt;
try {
stmt = con.createStatement();
// do something with the statement
} catch (SQLException e) {
LOG.error("SQL error", e);
} finally {
try { if (stmt != null) stmt.close(); } catch (SQLException se) { LOG.error("Error closing the statement", se); }
// if using Apache utils you could do
// IOUtils.closeQuietly(stmt);
}
結果セットも同様です。使用している Java のバージョンによっては、try-with-resources イディオムを使用できます。
try (Statement stmt = con.createStatement()) {
// do something with the statement
} catch(SQLException e) {
LOG.error("SQL error", e);
}
try
Statement はインターフェイスを実装しているため、Java はブロックの最後でステートメントを閉じAutoCloseable
ます。
これはアプリケーションからのみ処理する必要があります。データベースとは関係ありません。いくつかのステートメントが正しく閉じられていません。open_cursors=10000 の場合でも、このエラーが発生します。 .同様に、すべてのステートメントを閉じるようにしてください。詳細については、このリンクを参照してください。
ステートメントのexecuteQueryメソッドを実行すると、カーソルが作成されます。カーソルはデータベースで定義されており、jdbcで制御できます。次のURLから詳細情報を見つけることができます。 カーソルのwiki