2

JDBC で Oracle データベースを使用し、接続で INSERT を実行します。挿入ごとに、新しい を作成しますStatement

多くの挿入 (>1000) の後、エラーORA-01000が発生します。これは、Oracle が挿入用に開いているカーソルを持っていることを意味します。私は知っています、私は声明を閉じていません。それらを閉じると、すべてがうまくいきます。

問題は、なぜ Oracle が挿入アクション用のカーソルを作成するのかということです。

を実行するとSELECT、オラクルはResultSetお返しします。結果セットを閉じようとしましたが、基になるステートメントは閉じませんでした。この場合 (挿入なし)、問題は発生しません。

4

2 に答える 2

1

Oracle のすべてのステートメントはカーソルです。Oracle のカーソルは、クライアントによって再利用されることを意図しています。クライアントがカーソルを使用しなくなった場合、クライアントはカーソルを閉じる必要があります。

Java では、ほとんど常にPreparedStatement. 通常のことは忘れてStatementください。それらを使用する理由はほとんどありません。

一度解析して、PreparedStatement必要な回数だけ実行します。

  1. 準備ステートメント
  2. 変数の数だけバインドする
  3. 実行する
  4. 完了するまで 2 ~ 3 を繰り返してから閉じます。

または、DB ラウンドトリップを制限したい場合は、次のことができます。

  1. 準備ステートメント
  2. 変数の数だけバインドする
  3. addBatch
  4. 完了するまで 2 ~ 3 を繰り返してから、executeBatch
  5. カーソルを閉じる
于 2013-05-30T13:55:13.467 に答える