一貫した状態でJBossの下でHibernateでEntityManagerのキャッシュを維持する方法は?

StackOverflow https://stackoverflow.com/questions/1288085

質問

HibernateでJBossを実行しており、この問題を抱えています。

セッションBeanがEntityManagerを使用してエンティティを見つけると、EntityManagerのキャッシュにはすでに存在する可能性があり、その状態はすでに時代遅れである可能性があります。コードがそのようなエンティティを使用して決定を下す場合、バグを生成する間違った決定を下す可能性があります。

これが例です。

HTTPリクエスト1.セッションBeanはエンティティインスタンスを作成し、フィールド「A」セットを値に保存します1.永続的なエンティティはID = 4を取得します。

HTTPリクエスト2.セッションBeanがID = 4のエンティティを検索し、そのフィールドを値2に設定して保存します。

HTTP要求3.セッションBeanはID = 4のエンティティを検索し、フィールド「A」のフィールドをチェックします。値が1の場合、それは1つのことをします。2の場合は別のことを行います。

要求3のEMがリクエスト1と同じである場合、望ましくない動作が発生します。私はこれをテストし、約を得ました。故障の10%。

質問は - これを避ける方法は? em.refresh()またはem.clear()を呼び出すたびに、エンティティが最新であることを確認する必要があるたびに、リソースの無駄であるように思われます。

役に立ちましたか?

解決

アルテム、

これはaのようです 繰り返し テーマ あなたの質問の中で:-)

私はあなたが以前に与えられた答え(私のものを含む)があなたが望んでいたものではないかもしれないことを理解していますが、彼らは変わらないでしょう:

  • Entity Managerは、Hibernateセッションにマッピングされており、通常は短命である必要があります。 ここ Hibernateセッションに関連する作業、取引、範囲の単位の良い説明です。以前に見たことがない場合は、見てください。
  • あなたのアプリケーションがある場合 一貫して エンティティマネージャーを維持すると、その戦略の変更を真剣に検討する必要があります。使用するよりも長い取引が必要ないくつかの場所でそれをやっているだけなら refresh() 方法は間違いなくすべての悪の中でより少ない。
  • とは異なります セカンドレベルのキャッシュ 実装がクラスター化されているため、セッションレベルのキャッシュは異なるセッション(エンティティマネージャー)間で同期されていません 意図的に 同じエンティティへの同時更新は介して処理されます 楽観的なロック Hibernateまたはアプリケーションレベルのロックによって提供されます。
  • 理論的には(ORMアクセスが十分に分離されている場合)、さまざまなエンティティマネージャーが保有するエンティティの独自のキャッシュ(必要に応じてクラスタブル)を維持できます。適切に登録する必要があります イベントリスナー それぞれでキャッシュを同期させます。しかし、私はこのアプローチに対して強くアドバイスします - 実装してバグが発生しやすいだけでなく、これでHibernateのパラダイムに反対することになるでしょう。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top