2017-05-05 13 views
1

entity Aがあり、@Cacheableと定義されています。そして、クエリキャッシュには、entity Aが指定されたキャッシュ領域の下に「regionA」とロードされています。これはsetHintと有効なキャッシュによって実行されます。 wildflyの設定についてはInfinispan 2LC:クエリーキャッシュに指定された領域を持つエンティティキャッシュ

entityキャッシュはデフォルトevictionexpirationレットは以下のように言ったように、regionAはありませんevictionexpiration 1として日どこで構成されています。

 <local-cache name="entity"> 
      <transaction mode="NON_XA"/> 
      <eviction strategy="LRU" max-entries="10000"/> 
      <expiration max-idle="1000000"/> 
     </local-cache> 
     <local-cache name="local-query"> 
      <eviction strategy="LRU" max-entries="10000"/> 
      <expiration max-idle="100000"/> 
     </local-cache> 
     <local-cache name="regionA" statistics-enabled="true"> 
      <eviction strategy="NONE" max-entries="-1"/> 
      <expiration lifespan="86400000" max-idle="14400000"/> 
     </local-cache> 

ここで最初に実行すると、クエリキャッシュの結果がないため、SQLが実行されてエンティティをフェッチします。後で2回目の実行は、キャッシュregionAから取られているようだ。しかし、18時間後、同じクエリを実行しようとしたが、クエリが再度実行されたように見える。

クエリキャッシュが「1日」の有効期限に設定されているとしたら、なぜそれがSQLを再度実行するのでしょうか?その時間までにentityキャッシュが期限切れになったのでしょうか?したがって、entityキャッシュにはキャッシュ領域固有の設定が適用されません。 特定のキャッシュ領域に格納されたこれらのエンティティを区別する方法は、領域固有の設定に従います。

ありがとうございました。

答えて

3

あなたはmax-idle="14400000"です。これは、クエリが過去4時間以内に実行されなかった場合、キャッシュされた結果が失効することを意味します。

+0

ありがとうございます。したがって、エンティティを指定してregionAキャッシュ構成を使用し、指定されたキャッシュ領域に格納する方法はありますか?デフォルトでは、各エンティティは独自の領域の下に作成するためです。 – ulab

+0

リージョンを定義できるHibernateの 'org.hibernate.annotation.Cache'を使う必要があります。あるいは、これを外部的に 'orm.xml'で設定します。 –

+0

ありがとう、私はそれを得た。したがって、hibernate.cfgを使用して、指定された領域を使用するようにすべてのエンティティを構成するか、または指定された領域を使用するために各エンティティを構成できます。しかし、キャッシュ領域をregionAとして持つクエリで参照されているエンティティのみを指定することはできません。右? – ulab

関連する問題