2011-01-06 7 views
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) 

。これはdocumentationの私の理解に基づいています。

アプリケーションは、正常に見えるメッセージ(ログストリームにWARNやERRORメッセージなど)を入れずに正常に展開されます。短い時間の間、私は(これを見るためにHibernateの統計を使っています)キャッシュが動作しているのを見ていますが、フォームのスタックトレースを取得した後も(たとえリモートアクセスのない単一のユーザとしてログオンしていても)

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

を最終的に名前に戻る巨大なスタックトレースに続いて

SELECT x FROM X WHERE x.deleted = false 

名前付きクエリには、キャッシングに関する追加の注釈はありません。

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

+1

確かにそれは助けになるだろうが、私はキャッシュのロックと分離の設定を試してみるだろう。 – Stas

+0

これは役に立ちました - mvcc-entityではなくpessimistic-entityを使用しました。 –

答えて

1

最初のいくつかの質問:

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

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

 
Object A#1 
-- Object B#1 

Object A#2 
-- Object B#1 

また、問題の原因がわからなくても解決策を予測するのは少し難しいです。そして、私は、Hibernateのログだけが問題が本当に何かを教えてくれるのではないかと心配しています。

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

+0

コメントありがとうございます。あなたの質問に答えて。 1)これはアプリケーションに伝播され、いくつかの問題を引き起こします。 2)すべてのキャッシング可能なエンティティに同じ方法で注釈が付けられますが、このように注釈が付けられたエンティティのほんの一部です。 3)クラスには他のキャッシュされたオブジェクトをプルするいくつかの@ManyToOne関係があります。これにより問題が発生する可能性があるというあなたの疑惑に同意するので、私はあなたが提案したロギングの変更を行い、何が起こるか見るでしょう。ありがとう! –

+0

mvcc-entityの代わりにpessimistic-entityを使用するようにキャッシュ設定を変更し、エラーメッセージが消えました。測定結果によると、キャッシュは改善されているので、現時点ではそのまま使用します。私はこの答えを受け入れていますが、デバッグトレースのヒントは正しい方向に向いています。 –

0

CacheConcurrencyStrategy.NONSTRICT_READ_WRITEを試しましたか?私はドキュメントをよく読んで何を選ぶべきか正確には分かりませんが、私のプロジェクトではうまくいくようです。私は、CacheConcurrencyStrategy.TRANSACTIONALがあまりにも安全で、特定の状況ではキャッシュのパフォーマンスを避けると思います。

+0

CacheConcurrencyStrategy.NONSTRICT_READ_WRITEは、JBossキャッシュではサポートされていないようです(http://docs.jboss。 org/hibernate/core/3.3/reference/ja/html/performance.html#performance-cache)。私は、エンティティが変更される可能性が非常に低いため、READ-ONLYは使用できません。 –

関連する問題