0

JobsフィールドNameとを持つテーブルがありますStatus

新しいレコードのジョブ テーブルをポーリングするために、Tomcat インスタンスに 2 つの個別のアプリケーションをデプロイしようとしていますが、同じジョブ レコードが両方のプロセスで受信されないようにすることが重要です。これどうやってするの?

これまでの私の(失敗した)アプローチは、春の統合を使用することでした:

<int-jdbc:inbound-channel-adapter 
    query="select * from jobs where status=1"
    channel="rawInputDataListChannel"
    data-source="dataSource"
    update="update input_table set status=2 where status=1">
    <int:poller fixed-rate="1">
        <int:transactional isolation="READ_COMMITTED" />
    </int:poller>
</int-jdbc:inbound-channel-adapter>

これが機能しなかったので、Tomcat にトランザクション マネージャーを配置して、両方のアプリケーションで共有できるようにすればうまくいくのではないかと考えましたが、それを起動して実行するのに苦労しています。このアプローチは機能しますか?

4

1 に答える 1

10

あなたの質問のタイトルは休止状態に言及しているので、JPA 2.0が提供しなければならないものを見てみましょう。これはLockMode、悲観的ロックのアイデアに関連しています。あなたが見ているケースでは、おそらく同時にクエリを実行し、各 JVM に一意の結果セットを取得させたいと考えています。その場合は、をエミュレートする必要がありますSELECT... FOR UPDATE(これは独自仕様であり、そのステートメントを直接サポートするかどうかはデータベースに依存します)。

@LockModeJPA 2.0では、結果セットが更新のために取得される ことを使用および指定できるため、データベースで「ロック」して、他の接続が同じ結果を取得できないようにします。

この記事を見て、私よりもうまく説明してみてください。特に「悲観的な」パターンを見てください。

編集 >>>

hibernate 3.x を見ている場合は、このリンクを試してください

于 2013-07-20T01:53:09.120 に答える