2017-05-05 83 views
1

我有一个entity A,它被定义为@Cacheable。我有查询缓存加载entity A指定的缓存区域说“regionA”。这是通过setHint并启用缓存完成的。Infinispan 2LC:在查询缓存中指定区域的实体缓存

至于在wildfly的设置,regionA没有配置evictionexpiration 1天,其中作为entity缓存有默认evictionexpiration让的说,如下。

 <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运行来获取实体。第二次运行后,3rd似乎是从缓存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