2

Java コードでループを使用して、データベースに行を挿入しています。次に、エラーが発生しました-

ORA-01000: maximum open cursors exceeded

少し検索したところ、各行を追加した後に準備済みのステートメントまたはステートメントを閉じると、エラーを取り除くのに役立つことがわかりました。

しかし、私は理解する必要があります -

  1. カーソルとは
  2. カーソルの数を変更できますか? はいの場合、それは良いことですか?
4

3 に答える 3

7

このリンクでは、カーソルとは何か、どのように機能するかについて説明します。

はい、次のステートメントを使用して、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);
}

tryStatement はインターフェイスを実装しているため、Java はブロックの最後でステートメントを閉じAutoCloseableます。

于 2012-08-27T09:05:05.807 に答える
3

これはアプリケーションからのみ処理する必要があります。データベースとは関係ありません。いくつかのステートメントが正しく閉じられていません。open_cursors=10000 の場合でも、このエラーが発生します。 .同様に、すべてのステートメントを閉じるようにしてください。詳細については、このリンクを参照してください。

于 2012-08-27T09:05:41.137 に答える
0

ステートメントのexecuteQueryメソッドを実行すると、カーソルが作成されます。カーソルはデータベースで定義されており、jdbcで制御できます。次のURLから詳細情報を見つけることができます。 カーソルのwiki

于 2012-08-27T09:13:33.233 に答える