首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate二级缓存不使用JBoss Infinispan自定义区域配置

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

Stack Overflow用户
提问于 2022-07-04 09:29:23
回答 1查看 61关注 0票数 0

我们有一个项目

  • JBoss EAP 7.4.4.GA (WildFly Core 15.0.8)
  • 冬眠5.3.25最后-红帽-00002

第二级缓存按照“JBoss文档”中“persistence.xml”中的描述进行了配置:

代码语言:javascript
复制
<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中配置:

代码语言:javascript
复制
    <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后过期。

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

代码语言:javascript
复制
    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“缓存,而使用”本地查询“(默认查询缓存)的值。示例运行:

代码语言:javascript
复制
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“中显式定义了Infinispan工厂,但没有成功
  • 使用实体本身进行测试并观察到相同的行为(仅使用默认的“实体”配置)

所以实体&查询正在成功地被缓存,但我只是无法覆盖特定区域的缓存配置。这可能是什么原因呢?

EN

回答 1

Stack Overflow用户

发布于 2022-07-14 12:27:28

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

代码语言:javascript
复制
<property name="hibernate.cache.infinispan.region-name.cfg" value="cache-name"/>

在你的例子中,你可能想要这样的东西:

代码语言:javascript
复制
<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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72854537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档