【问题标题】:Cache region configurations in persistence.xml在 persistence.xml 中缓存区域配置
【发布时间】:2014-05-25 10:53:03
【问题描述】:

根据 this documentation 的说法,当使用 Infinispan 和 Hibernate 时,可以定义多个缓存区域并单独配置它们。我正在使用 WildFly 8.0,它使用 Infinispan 作为 Hibernate 的默认 2LC 提供程序。所以这是我对休眠缓存容器的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 秒。我在这里错过了什么?

【问题讨论】:

  • 在应用服务器内部运行时,需要添加部署名称,即hibernate.cache.infinispan.&lt;warname&gt;.&lt;unitname&gt;.&lt;FQN of entity&gt;.expiration.max_idle。你可以试试这个吗?

标签: java hibernate caching persistence infinispan


【解决方案1】:

正如 Galder Zamarreño 在 cmets 中提到的,部署名称必须添加到区域中。

或者,您可以将 prefix 显式设置为空 ("") 或类似下面的某个值。

<property name="hibernate.cache.region_prefix" value="my-cache"/> 

然后指定区域prefix如下。

<property name="hibernate.cache.infinispan.my-cache.myRegionName.expiration.max_idle" value="5000"/>

【讨论】:

    【解决方案2】:

    确保将 factory_class 放入 persistence.xml:

    <property name="hibernate.cache.region.factory_class"
                value="org.hibernate.cache.infinispan.InfinispanRegionFactory" />
    

    值 5000 真的是你想要的吗?请记住,这是以毫秒为单位的,因此您的缓存最大空闲时间设置为 5 秒。

    关于缓存区域,我找不到一种方法来为查询创建一个定制化的。不过,可以覆盖 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" />
    

    【讨论】:

      猜你喜欢
      • 2020-07-22
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2021-06-26
      • 2023-02-10
      相关资源
      最近更新 更多