根据 this documentation ,在Hibernate中使用 Infinispan 时,可以定义多个缓存区域并单独配置它们。我正在使用 WildFly 8.0 ,它使用Infinispan作为Hibernate的默认2LC提供程序。所以这是我的hibernate缓存容器的standalone.xml配置:
<cache-container name="hibernate" default-cache="local-query" module="org.hibernate">
<local-cache name="entity">
<transaction mode="NON_XA"/>
<eviction strategy="LRU" max-entries="10000"/>
<expiration max-idle="100000"/>
</local-cache>
<local-cache name="local-query">
<transaction mode="NONE"/>
<eviction strategy="LRU" max-entries="10000"/>
<expiration max-idle="100000"/>
</local-cache>
<local-cache name="timestamps">
<transaction mode="NONE"/>
<eviction strategy="NONE"/>
</local-cache>
</cache-container>
因此,最大空闲到期时间设置为100秒。这就是我告诉Hibernate缓存查询的方法:
slotQuery.setHint("org.hibernate.cacheable", true)
.setHint("org.hibernate.cacheRegion", "myRegionName")
.getResultList();
一切正常,查询缓存100秒。但是,当我尝试在persistence.xml中为查询配置单独的缓存区域时:
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.infinispan.myRegionName.expiration.max_idle" value="5000"/>
设置未被覆盖,查询缓存100秒。我在这里缺少什么?
答案 0 :(得分:1)
正如GalderZamarreño在评论中所提到的,部署名称必须添加到该地区。
或者,您可以将prefix
明确设置为空(“”)或某些值,如下所示。
<property name="hibernate.cache.region_prefix" value="my-cache"/>
然后指定区域prefix
,如下所示。
<property name="hibernate.cache.infinispan.my-cache.myRegionName.expiration.max_idle" value="5000"/>
答案 1 :(得分:0)
确保将persistence.xml放入factory_class:
<property name="hibernate.cache.region.factory_class"
value="org.hibernate.cache.infinispan.InfinispanRegionFactory" />
5000的值真的是你想要的吗?请记住,这是以毫秒为单位,因此您的缓存最大空闲时间设置为5秒。
关于cacheRegion,我找不到为查询创建一个costumized的方法。但是可以覆盖infinispan默认值。您可以使用默认查询缓存区域来配置max_idle,这样:
<!-- entity cache, never expires = -1 -->
<property name="hibernate.cache.infinispan.entity.expiration.max_idle"
value="-1" />
<!-- query cache, with 12 hours expiration -->
<property name="hibernate.cache.infinispan.query.expiration.max_idle"
value="1620000" />