0

私のアプリケーション ログでは、クエリの結果が繰り返し処理されていること (JDBC ResultSet を使用しており、派手なことは何もありません) と、実際にはテーブルにある特定の結果が欠落しているか、結果セットに表示されるのが遅すぎることがわかります (I'これが発生した場合、最後に到達する前に主キー違反が発生することが多いため、どちらかわかりません)。

私のクエリは次のとおりです。

select t.* from myschema.vm t order by id;

ただし、SQL Developer で (データベースが変更されていないときに) まったく同じクエリを実行すると、この問題が発生することはなく、アプリケーションでは約半分の時間しか発生しません (原因で発生しない場合があると思われます)。すべての挿入と更新によりテーブルが変更されます)。

その他の重要なポイント:

  1. ResultSet を反復処理しながら、別のデータベース接続を使用して更新、挿入、および場合によっては削除を行っています。しかし、これは問題ではありませんよね?
  2. 接続プーリングに BoneCP を使用しています。
  3. データベースのエンコーディングは AL32UTF8 です。

なぜこうなった?それは私を夢中にさせています!

4

2 に答える 2

0

この問題は、ユーザー エラーが原因でした。別のマシンでアプリケーションの別のコピーを実行していましたが、それは忘れていましたが、同時にデータベースを変更していました。

于 2013-10-31T09:28:23.033 に答える
0

Oracle の結果セットは、後でデータ (またはその一部) をフェッチしても、クエリを実行した瞬間に凍結されます。そのため、他のセッションがデータを挿入すると、カーソルを開いたときに既にコミットされている行のみが (正しく順序付けされて) 検出されます。

また、シーケンスまたは共有アトミック カウンターを使用する代わりに、テーブルで見つかった現在の値を評価して ID を作成していると思われるため、PK 違反が発生します。

于 2013-10-22T12:36:39.253 に答える