5

私は次の設定をしています:

  • 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) への参加もサポートしていることを考えると、真のトランザクション性を実現する方法はあるのでしょうか? 多分私はそれを見ていないだけです。

4

1 に答える 1

0

私は非常によく似た設定に取り組んでいます。これらのバージョンでは、真のトランザクション性は実現できません。いくつかの理由がありますが、その一部は次のとおりです。

  1. Hibernate Search はコミット段階でインデックスを更新します
  2. バックグラウンド スレッドでの Hibernate Search プロセス - 「同期」の場合でも
  3. Infinispan キャッシュ ストアの更新はコミットフェーズで行われます

ここでは、データベースへの最終的な挿入をトランザクションの本体で実行し、最後にコミットする必要があるため、トランザクション フェーズが重要です。

私の解決策は、インデックス更新のトランザクション性を無視することでした。私の場合、厳密には必要ありませんでした。

于 2014-10-03T20:11:15.550 に答える