質問

私は JBoss 5.1.0 GA を Hibernate とともに使用しており、現在 2 次キャッシュを有効にしようとしています。次のプロパティを Hibernate 構成に追加しました。

<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.MultiplexedJBossCacheRegionFactory"/>
<property name="hibernate.cache.jbc2.query.localonly" value="true"/>
<property name="hibernate.cache.region_prefix" value="my_prefix" />

また、変更の頻度が低いと予想されるエンティティには、次の注釈を付けました。

@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL)

これは私の理解に基づいています ドキュメンテーション.

アプリケーションは、恐ろしいメッセージを表示せずに正常にデプロイされます (例:ログ ストリーム内の WARN または ERROR メッセージ)。短期間ではキャッシュが機能していることがわかります (これを確認するために Hibernate 統計を使用しています)。しかし、しばらくすると、(リモート アクセスがまったくない単一ユーザーとしてログオンしている場合でも) フォームのスタック トレースが得られます。

「トランザクションはMyClassを新たに作成しようとしました。このトランザクションが開始されてから、別の(おそらくリモート)トランザクションによってすでに作成されています。同時作成イベントがあります」

巨大なスタック トレースが続き、最終的には次の形式の、私が作成した名前付きクエリまで遡ります。

SELECT x FROM X WHERE x.deleted = false

名前付きクエリには、キャッシュ用の追加の注釈はありません。

この問題の解決方法についてアドバイスをいただければ幸いです。

役に立ちましたか?

解決

最初にいくつか質問します。

  1. この例外はアプリケーションに伝播されますか?つまり、あなたはこの影響を受けていますか? それともログ内のメッセージが気になっているだけですか?
  2. すべてのエンティティにトランザクション戦略の注釈が付けられていますか、それとも一部のエンティティのみですか?
  3. クエリは別のクラスの積極的にフェッチされたオブジェクトを取得しますか?

現時点でできる最善のことは、キャッシュ操作の DEBUG (または TRACE) ログを有効にすることだと思います。 log4j.logger.org.hibernate.cache=debug これにより、Hibernate が何をしているのかが正確にわかります。私 容疑者 Hibernate はオブジェクトをキャッシュに保存しようとしており、同じセッション中に同じオブジェクト (おそらく別のオブジェクトのツリーの一部として) を見つけると、再度同じことを実行します。少し前にクエリ キャッシュのタイムスタンプの問題がありましたが、ここでも同じ問題が発生している可能性があります。例えば:

Object A#1
 -- Object B#1

Object A#2
 -- Object B#1

しかし、繰り返しになりますが、問題が何であるかを知らずに、解決策が何であるかを予測するのは少し困難です。そして、実際に何が問題なのかを知ることができるのは Hibernate のログだけではないかと思います。

追伸:これはコメントとして投稿する予定でしたが、長すぎました。

他のヒント

あなたはCacheConcurrencyStrategy.NONSTRICT_READ_WRITEを試みたことがありますか?私は、ドキュメントに多くの時間を読み、選択する正確かわからないが、私のプロジェクトのための仕事の罰金に思えます。私はCacheConcurrencyStrategy.TRANSACTIONALはあまり安全で推測し、特定の状況でのキャッシュのパフォーマンスを避けるます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top