私は次の設定をしています:
- JPA (2.0) から Hibernate (4.1)
- 第 2 レベルのキャッシュとしての Infinispan (5.1)
- Hibernate に接続された Hibernate Search (4.1)
- Hibernate Search (Lucene) のディレクトリとしての Infinispan
- Infinispan ディレクトリの JDBC CacheStore を接続しました
- エンティティと Lucene ディレクトリの両方を格納する PostgreSQL (9.1) データベース。
- トランザクションマネージャーとしての Bitronix (2.1.2)
- 私は Java EE を使用していませんが、Spring (3.1) を使用しています。
Infinispan as Second Level Cache は問題ありません。回復は必要なく、キャッシュの性質上、独自のトランザクションで変更を読み取ることができます。
ソースコードを何時間も読んだ後、エンティティを更新すると、Hibernate Search は Lucene ディレクトリを更新しませんが、トランザクションの最後に (コミットした場合)、更新したばかりのテキストを検索したいと思いました。同じトランザクション内で、私はできませんか?
さらに、トランザクションの完了後、Hibernate Search は別のスレッドでディレクトリの更新を行います。ディレクトリの更新の 1 つが失敗した場合、Lucene は私のエンティティと一致しなくなりますか? また、更新がディレクトリにディスパッチされる前に何かが発生し、回復が必要になった場合、それらの更新は失われますか?
この「最初の」トランザクションが正常にコミットされたと仮定すると、更新は Infinispan ディレクトリに送信されました。ここで新しいトランザクションが開始されます。誰によって?Lucene には、JMS を使用して更新を送信するオプションがあります。オプションがアクティブ化されているとします。そのため、JMS メッセージは新しいトランザクションを初期化します。
Infinispan は、受信した更新を使用してメモリ ディレクトリを変更しますが、永続的な CacheStore は、コミット後、このトランザクションの完了時に再び更新されます。したがって、jdbc CacheStore の更新中に何かが発生した場合、更新されずに放置される可能性がありますが、Infinispan メモリ ディレクトリにはそれらが適用されます。
私の質問は、私が使用しているすべてのモジュールがトランザクションをサポートし、グローバル トランザクション (XA) への参加もサポートしていることを考えると、真のトランザクション性を実現する方法はあるのでしょうか? 多分私はそれを見ていないだけです。