2

JPAプロバイダーとしてHibernate3.5.6-FINALを使用し、レベル2クエリキャッシュプロバイダーとしてinfinispan 4.2.0.ALPHA1を使用する場合、Hibernateのドキュメントとは異なり、データベースの結果が個別のメモリに複数回保存されるのではないかと心配しています。 infinispan namedCache、 "local-query"内の場所(同じレコードの一部を返す異なるHQLクエリの結果セット用)。頻繁に発行されるクエリの多くは結果セットに大きな共通部分があるため、これによりメモリがすぐに使い果たされ、クエリキャッシュが使用できなくなる可能性があります。

クエリキャッシュのバッキングとして休止状態の第2レベルのエンティティキャッシュを動作させることができないように見えるため、infinispanまたは休止状態、あるいはその両方を誤って構成していると思われます。infinispanの例をJPAとしての休止状態のレベル2クエリキャッシュとして見たいと思います。その結果自体は、JPAとしての休止状態のレベル2エンティティキャッシュとしてinfinispanによってバックアップされます。

詳細:

Hibernate 3.5ドキュメント(http://docs.jboss.org/hibernate/core/3.5/reference/en/html/performance.html#performance-querycache-enable)の主張:

クエリキャッシュは、キャッシュ内の実際のエンティティの状態をキャッシュしません。識別子の値と値型の結果のみをキャッシュします。このため、[原文のまま]クエリキャッシュは、クエリ結果キャッシュの一部としてキャッシュされることが期待されるエンティティの第2レベルのキャッシュと常に組み合わせて使用​​する必要があります。

ただし、 persistence.xmlで次のようにinfinispan( http://community.jboss.org/wiki/usinginfinispanasjpahibernatesecondlevelcacheproviderによる)を使用してHibernateレベル2クエリキャッシュを有効にします。

        <property name="hibernate.cache.use_second_level_cache" value="true"/>
        <property name="hibernate.cache.use_query_cache" value="true"/>
        <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory"/>
        <property name="hibernate.cache.infinispan.statistics" value="true"/>

infinispan CacheManager JMX属性を調べると、infinispan-configs.xml(GAV org.hibernate / hibernate-infinispan / 3.5.6-FINALから、GAV org.infinispan / infinispan-core /に依存)で定義された6つのnamedCacheのうちの1つのみが表示されます。 4.2.0.ALPHA1)は、そこで定義されていないものとともに作成されます。

org.hibernate.cache.UpdateTimestampsCache(created)
timestamps(not created)
entity-repeatable(not created)
entity(not created)
local-query(created)
replicated-query(not created)
replicated-entity(not created)

上記で参照されているjbosswikiの記事がエンティティキャッシュについて説明している場合、namedCacheの「エンティティ」を参照していると思われます。ただし、そのキャッシュを作成する方法が見つかりません。(余談ですが、infinispan-configs.xmlのローカルクエリは作成されますが、infinispan-configs.xmlのタイムスタンプは作成されません。代わりに、Hibernateの他の場所で定義する必要があるUpdateTimestampsCacheを受け取ります。)指定

        <property name="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE"/>

私たちのpersistence.xmlで、関連するエンティティに注釈を付ける@ javax.persistence.Cacheableは(infinispan CacheManager JMX属性に従って)エンティティキャッシュを作成します(エンティティのパッケージ修飾されたJavaクラス名として名前が付けられます)が、未使用のようですJMX統計がローカルクエリの高いヒット率を示している場合(そして実際、そのようなキャッシュヒットクエリの優れたパフォーマンス)。

私の恐れは根拠がなく、隠れて、infinispanは、複数のHQLクエリの結果セットで返された場合でも、エンティティの情報を1回だけ保存していますか?そうでない場合、infinispan-configs.xmlのnamedCache、エンティティデータの重複ストレージを回避するために使用される「エンティティ」を取得する適切な方法は何ですか?最後に、休止状態のレベル2タイムスタンプキャッシュとして、「org.hibernate.cache.UpdateTimestampsCache」ではなく、infinispan-configs.xmlのnamedCache「timestamps」をどのように使用できますか?

4

1 に答える 1

3

私の恐れは根拠がないことがわかりました。これは実際、Hibernateのドキュメントに示されているように動作しています。クエリキャッシュはエンティティ識別子のみを返し、Hibernateはそれらのエンティティを個別にアセンブルします。

infinispan-configs.xmlのnamedCaches、「entity」、および「timestamps」に関する私の混乱は、誤った期待からのみ生じています。namedCache「local-query」はinfinispan-configs.xmlで定義されており、CacheManager JMX属性は「local-query」という名前のキャッシュが作成されていることを示していたため、「タイムスタンプ」と、 "実在物。" これはそうではありません。これらのnamedCachesは、CacheManager JMX属性(timetamps、entity、entity-repeatable、replicated-query、およびreplicated-entity)で常に示されます(作成されません)。それにもかかわらず、これらのnamedCachesの構成は次のとおりです。尊重されますが、「local-query」とは異なり、CacheManagerJMX属性の名前は一致しません。代わりに、キャッシュ領域名になります。タイムスタンプの場合は「org.hibernate.cache.UpdateTimestampsCache」、エンティティの場合はエンティティのパッケージ修飾されたJavaクラス名です。

また、レベル2エンティティのキ​​ャッシュ領域がクエリキャッシュを正しくバックアップしているにもかかわらず、JMX統計でキャッシュヒットが発生しなかった理由も特定しました。私のテストとアプリケーションコードは、クエリキャッシュから結果セットに返されるすべてのエンティティがすでにPersistenceContext、別名セッション、別名Hibernateレベル1キャッシュにあるように設定されていたため、結果セットのアセンブリ中にクエリキャッシュヒット、レベル2エンティティキャッシュ領域からではなく、そこから提供されました。

于 2011-05-19T18:19:48.000 に答える