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」をどのように使用できますか?