2

私は、永続性のためのMDB、バネ統合およびJPAに基づいたイベントドリブンアプリケーションを持っています。 アプリケーションは、max-pool-sizeのデフォルト値(16)でweblogic 10.3にデプロイされます。MDBのレース条件:これを処理する最善の方法は何ですか?

私のアプリケーションは、DBを変更するメッセージを処理する必要があります。 ドメイン・オブジェクトが存在しない場合は挿入するか、存在する場合は更新する必要があるというメッセージを処理する必要があるとします。

オブジェクトが存在するかどうかをチェックし、JPA上でマージを呼び出すという私のコンポーネントは、DBチェックを変更します。 DAO上でマージを呼び出すと、並行して2つのメッセージが同時に実行されるため、オブジェクトはまだ永続化されていないため、JPAは2つのinsert文をトリガします。

イベントドリブンアプリケーションでこの種の「競合状態」を処理するパターンはありますか?

種類が

マッシモ

答えて

1

に関して最も簡単な解決策は、更新を実行すべき、再度mergeを呼び出し、その後、第2のインサートによってスローされた例外をキャッチすることです。

代わりに、最初のものが完了するまでmergeがブロックされていることを確認すべきであるmergeSERIALIZABLEでトランザクション分離を行うcouldtry、2つ目は、その後、更新を実行すべきです。

この全体的なシナリオの主な問題は、複数の同時イベントが発生し、特定のエンティティを変更することがある場合、正しい順序で実行していることを確認することです。確かに、同時に処理するのではなく、順次処理する必要がありますか?コンカレント・イベント・コンシューマを使用すると、その順序は非決定的になります。

+0

OK、すてきなショット。シリアライズ可能な分離レベルがノードに対して直列化可能であるか、クラスタに対して直列化可能かどうかを知っていますか?私は2つのノードを持つクラスタにアプリケーションを配備する必要があります。敬具。 Massimo –

+0

@MassimoUgues:トランザクションマネージャに依存しますが、通常はデータベースレベルの分離であるため、クラスタに対して安全です。 – skaffman

+0

私は春JTAを使用しているので、クラスタに対して安全です。私は分離= SERIALIZABLEという大きなボトルネックになると考えていました。この種の並行処理は、同じIDで識別される一部のドメインオブジェクトに影響を与えるメッセージに対してのみ処理する必要があるため、DBベースのモニタ(IDの更新のための何らかの選択)を考えていました。あなたはそれについてどう思いますか? –