我们有一个项目
第二级缓存按照“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>已修改过期以便于测试:默认缓存不过期,自定义查询缓存在1s后过期。
使用包装器方法为相关查询启用查询缓存:
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“缓存,而使用”本地查询“(默认查询缓存)的值。示例运行:
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因此,很明显,查询使用的是缓存,但我们看到缓存命中,这是预期的失败。我已经
所以实体&查询正在成功地被缓存,但我只是无法覆盖特定区域的缓存配置。这可能是什么原因呢?
发布于 2022-07-14 12:27:28
若要覆盖特定区域的缓存配置,需要指示区域如何映射到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
https://stackoverflow.com/questions/72854537
复制相似问题