0

Java アプリケーションを使用して、oracle11g のテーブルのすべての変更を追跡したいと考えています。

私は次のora_rowscnように使用することを考えています:選択を実行し、より新しいレコードを取得するたびに:

max = 0;

While(true){

   ps = con.prepare statement("Select rowscn, * from t where  ora_rowscn > ?");

   ps.setInt(max);

   max = calcMaxRowScn(ps.getResultSet());

}

calcMaxRowScn- 結果セットから最大行数を返します。

Oracle ドキュメントの状態:

"ORA_ROWSCN returns the conservative upper bound system change number (SCN) of the most recent change to the row"

そう:

  1. rowscn フィールドの使用は安全ですか?
  2. いくつかの更新を見逃す可能性はありますか?
4

1 に答える 1

1

更新を見逃すことはありません (削除を見逃すことは明らかです)。デフォルトでは、SCN は行レベルではなくブロック レベルで格納されるためORA_ROWSCN、テーブルが有効に構築されていない場合は特に、実際には変更が加えられていなくても、行の変更が表示される場合があります。ROWDEPENDENCIESアプリケーションが変更されていない行の処理を処理できる限り、それで問題ありません。もちろん、ORA_ROWSCNは索引付けされていないため、Java でループを実行するたびにテーブルを完全にスキャンすることになります。これは非常に遅くなり、データベース サーバーにかなり大きな負荷をかける可能性があります。

達成しようとしていることに応じて、より簡単なオプションがある場合があります。たとえば、独自のものをローリングする代わりに、継続的なクエリ通知のようなものを使用したい場合があります。

于 2013-11-06T21:54:25.900 に答える