0

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

名前付きクエリには、キャッシュ用の追加のアノテーションはありません。

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

4

2 に答える 2

1

最初にいくつかの質問:

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

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

オブジェクトA#1
 -オブジェクトB#1

オブジェクトA#2
 -オブジェクトB#1

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

PS:これはコメントとして投稿することを意図していましたが、これには長すぎました。

于 2011-01-06T12:33:18.930 に答える
0

CacheConcurrencyStrategy.NONSTRICT_READ_WRITEを試しましたか?私はドキュメントを何度も読んでいて、何を選択すればよいか正確にはわかりませんが、私のプロジェクトではうまく機能しているようです。CacheConcurrencyStrategy.TRANSACTIONALは安全すぎて、特定の状況でのキャッシュパフォーマンスを回避していると思います。

于 2011-01-06T12:42:45.337 に答える