2016-02-16 14 views
5

私は、Infinispanを休止状態の第2レベルキャッシュとして設定しようとしています。すべては問題ありませんが、デフォルトの設定、つまりすべてのキャッシュが共有する値を調整する必要があります。Infinispan JPA第2レベルキャッシュのデフォルト

@Cacheでアノテーションされたエンティティに対してキャッシュが自動的に作成され、infinispan.xmlで1つずつカスタマイズできます(<distributed-cache-configuratoin>)。しかし、これらのキャッシュのすべてについてデフォルト値(退去戦略など)を持たせたいと思います。

別のことは、これらの生成されたキャッシュをすべて「分散」(デフォルトでは「ローカル」)としてマークしたいと思います。私はこれらの事を行うにはどうすればよい

<cache-container default-cache="default" statistics="true"> 
    <transport stack="external-file" /> 
    <!-- Configuring specifics for the User entity. How to do it globally? --> 
    <distributed-cache-configuration name="user" statistics="true" /> 
</cache-container> 

は、ここに私のinfinispan.xmlからexceprtですか?

+1

デフォルトのキャッシュ設定の名前は 'entity'です。その名前を持つキャッシュを構成し、すべてのエンティティに適用する必要があります。 –

+0

ニース..ありがとう。あなたはそのドキュメントからリファレンスを持っていますか? – Bozho

+1

http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#caching-provider-infinispan-config –

答えて

4

エンティティのためdefault cache configurationentity命名されています

キャッシュの構成は キャッシュに格納されるデータの種類ごとに異なることがあります。 @Idでインデックスさ

entityエンティティまたは@EmbeddedId属性:キャッシュ構成テンプレートを上書きするためには、data-type は、のいずれかになります。 プロパティhibernate.cache.infinispan.data-type.cfgを使用しています。

immutable-entityエンティティは、@Immutable注釈付きで、 をmutable=falseとマッピングファイルに設定します。

naturalidエンティティは、@NaturalId属性でインデックスされています。

collectionすべてのコレクション。

timestampsマッピングエンティティタイプ→最終変更タイムスタンプ。クエリキャッシュには を使用しました。

queryマッピングクエリ→クエリ結果。

pending-puts無効化モードを使用する領域の補助キャッシュ キャッシュ。

collectionimmutable-entitynaturalidのデフォルトもentityのために指定した構成であるので、あなたはで見ることができるよう、(あなたはもちろんの別の構成をしたくない場合は)別々に設定する必要はありませんdocumentationおよびsource code。一般に

、エンティティ・インスタンスが関連するエンティティのIDのみが一緒に保存されていることを意味し、L2キャッシュにdisassembled hydrated stateに格納されているため、分散HibernateのL2キャッシュは、良いアイデアではないかもしれない製造親エンティティ状態を持つ。csコレクションは完全にあなたが持っているでしょうキャッシュからエンティティAインスタンスを組み立てるために、また、キャッシュ可能だったとしても

@Entity 
public class A { 
    @ManyToOne 
    private B b; 

    @OneToMany 
    private Collection<C> cs; 
} 

では、次のエンティティ(ABCはすべてキャッシュ可能です)を持っていると仮定します次のネットワークラウンドトリップは、クラスタの他のノードに移動します。

  1. エンティティAの状態を取得します。
  2. bアソシエーションに格納されているIDに基づいて、エンティティBの状態を取得します。
  3. cs IDのコレクションを取得します。
  4. csコレクション内の各IDについて、Cエンティティの状態を1つずつフェッチします。上記の明らか

、あなたが(例えば、クエリの結果から)Aインスタンスのコレクションの組み立てている場合、全てのAのインスタンスごとに実行されます。

これは、データベースを直接(適切に構成された遅延ロードを使用して、たとえばbatch sizeを使用して)読み取ると、分散キャッシュ内のすべてのネットワークラウンドトリップよりもはるかに効率的である可能性があることを意味します。

エンティティ/コレクションキャッシュを無効化クラスタモードで実行する理由の1つです(データは読み書きするノードでのみキャッシュされますが、変更されると他のノードで無効になります)。