0

リレーショナル データベース (現在は H2) を更新する Java アプリを作成しています。私は次のことを行うプロセスを持っています:

  1. 特定のデータ項目について外部システムにクエリを実行する
  2. インポート ログ テーブルを確認して、これらのアイテムが既にシステムにインポートされているかどうかを確認します。そうでない場合:
  3. 新しいデータ項目をさまざまなテーブルにインポートします。
  4. インポート ログ テーブルに新しいレコードを書き込みます。

このプロセスは、異なるスレッドで同時に実行される場合があります。2 つのスレッドが両方ともインポート ログをチェックし、そこに何も見つからず、両方ともデータ項目を挿入しようとする問題を回避したいと思います。

良いアプローチは何ですか?私は検討してきました:

  1. SERIALIZABLE トランザクション分離の使用。
  2. インポート ログの一意のインデックス制約に依存して、トランザクションの 1 つをエラーおよびロールバックします。
  3. プロセスを Java アプリの 1 つのスレッドに限定します。

さまざまな理由から、上記のどれもあまり魅力的ではないようです。よりうまく機能する可能性のある別のアプローチはありますか?

4

2 に答える 2

0

SERIALIZABLE トランザクション分離は、確かに目標を達成するための最も確実な方法ですが、パフォーマンスが低下する可能性があります。

考慮していないオプションが 1 つあります。それは、独自のセマフォを作成することです。

現在処理中の項目の静的な ConcurrentHashMap を作成し、(各挿入プロセスの開始時に - レコードを配置し、完了したら削除します。

次に、各スレッド プロセスは、挿入を開始する前にこのセマフォを参照できます。

于 2014-02-28T13:50:51.123 に答える