Hibernate二级缓存不使用JBoss Infinispan自定义区域配置



我们有一个使用的项目

  • JBoss EAP 7.4.4.GA(WildFly Core 15.0.8.Final-redhat-00001)
  • 休眠5.3.25.Final-redhat-00002

二级缓存的配置如JBoss文档中";persistence.xml":

<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
...
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.region_prefix" value="sskm-v2-region" />
<property name="hibernate.generate_statistics" value="true" />
<property name="hibernate.cache.infinispan.statistics" value="true" />

在";standalone.xml";Infinispan已配置:

<subsystem xmlns="urn:jboss:domain:infinispan:12.0">
...
<cache-container name="hibernate" default-cache="default-sskm-v2-cache" statistics-enabled="true" modules="org.infinispan.hibernate-cache">
<local-cache name="entity">
<heap-memory size="10000"/>
</local-cache>
<local-cache name="local-query">
<heap-memory size="10000"/>
</local-cache>
<local-cache name="timestamps"/>
<local-cache name="pending-puts">
<expiration max-idle="60000"/>
</local-cache>
<local-cache name="default-sskm-v2-cache">
<heap-memory size="1000"/>
<expiration lifespan="1200000" max-idle="1200000"/>
</local-cache>
<local-cache name="query.cache.LegalContext">
<heap-memory size="500"/>
<expiration interval="500" max-idle="1000"/>
</local-cache>
<local-cache name="be.fgov.kszbcss.sskm.model.legalcontext.LegalContext">
<heap-memory size="1000"/>
</local-cache>
</cache-container>
</subsystem>

为便于测试,对过期时间进行了修改:默认缓存不会过期,自定义查询缓存在1秒后过期。

使用包装器方法为相关查询启用查询缓存:

private <T> TypedQuery<T> createTypedQuery(CriteriaQuery<T> criteriaQuery) {
TypedQuery<T> typedQuery = getEntityManager().createQuery(criteriaQuery);
if (cacheQueries) {
typedQuery.setHint(QueryHints.HINT_CACHEABLE, true);
if (StringUtils.isNotBlank(cacheRegion)) {
typedQuery.setHint(QueryHints.HINT_CACHE_REGION, cacheRegion);
}
}
return typedQuery;
}

尽管所有这些配置,高速缓存只是拒绝使用自定义的";query.cache.LegalContext";缓存并使用"0"的值;本地查询";(默认查询缓存)。示例运行:

2022-07-04 10:50:22,229 INFO  [org.jboss.as.clustering.infinispan] (default task-1) {} WFLYCLINF0002: Started sskm-v2-region.query.cache.LegalContext cache from hibernate container
2022-07-04 10:50:22,230 DEBUG [org.hibernate.cache.internal.QueryResultsCacheImpl] (default task-1) {} Checking cached query results in region: query.cache.LegalContext
2022-07-04 10:50:22,231 DEBUG [org.hibernate.cache.internal.QueryResultsCacheImpl] (default task-1) {} Query results were not found in cache
...
2022-07-04 10:51:30,599 DEBUG [org.hibernate.cache.internal.QueryResultsCacheImpl] (default task-1) {} Checking cached query results in region: query.cache.LegalContext
2022-07-04 10:51:30,599 DEBUG [org.hibernate.cache.internal.QueryResultsCacheImpl] (default task-1) {} Returning cached query results

因此,很明显,查询使用的是缓存,但我们在预期未命中的地方看到了缓存命中。我有

  • 尝试添加/删除区域前缀,但未成功
  • 在";persistence.xml";但没有成功
  • 用实体本身进行测试并观察到相同的行为(仅使用默认的"实体"配置)

所以实体&查询已成功缓存,但我无法覆盖特定区域的缓存配置。造成这种情况的原因是什么

要覆盖特定区域的缓存配置,您需要在persistence.xml:中指示区域如何映射到缓存配置

<property name="hibernate.cache.infinispan.region-name.cfg" value="cache-name"/>

在你的情况下,你可能想要这样的东西:

<property name="hibernate.cache.infinispan.be.fgov.kszbcss.sskm.model.legalcontext.LegalContext.cfg" value="be.fgov.kszbcss.sskm.model.legalcontext.LegalContext"/>
<property name="hibernate.cache.infinispan.query.cache.LegalContext.cfg" value="query.cache.LegalContext"/>

有关更多详细信息,请参阅:https://infinispan.org/docs/stable/titles/hibernate/hibernate.html