2011-10-25 5 views
0

リスナー内にThread.sleep(50000)を入れてこれを証明しました。データは文字通り50秒間DBに格納されませんでした。PostInsertEventListenerは、DBが更新される前に実行されました

エンティティのID(これはBTWにあります)をWebサービスに渡して同じデータベースにアクセスしているので、これは奇妙でむしろ残念です。新しいスレッドで呼び出しを行わないと、データが存在しないためWebサービスが例外をスローします。

私はハック方法を適用し、新しいスレッド内の呼び出しを行う、おそらくいくつかの時間遅延を前に、それは、醜い

してくださいすることに役立つであろうことができます。

+0

PostInsert!=コミット。トランザクションを正しく使用していることを確認してください。あなたのケースでは、挿入後にDBに問い合わせるだけでしたが、コミットはその時点では起こっていないようです。 – SirVaulterScoff

答えて

1

これは、挿入がリスナーの後で行われるという事実とは関係ありません。これは、トランザクションのコミットが後に行われるという事実に関連しています。 Webサービスでは、データを挿入するトランザクションとして別のトランザクションが使用されるため、挿入トランザクションがコミットされるまで、挿入されたデータは表示されません。

2フェーズコミットが必要です。 JMSキューを介してWebサービスを呼び出し、JMSエンジンとデータベースの両方が一意のXAトランザクションマネージャによって処理されていることを確認します。