【问题标题】:How to enable infinispan-configs.xml's namedCache "entities", for use in backing its namedCache "local-query"如何启用 infinispan-configs.xml 的 namedCache “实体”,用于支持其 namedCache “local-query”
【发布时间】:2011-08-25 05:48:41
【问题描述】:

当使用 Hibernate 3.5.6-FINAL 作为我们的 JPA 提供程序并使用 infinispan 4.2.0.ALPHA1 作为二级查询缓存提供程序时,我担心与 Hibernate 文档相反,数据库结果会被多次存储在 infinispan namedCache 中的不同内存位置(对于返回某些相同记录的不同 HQL 查询的结果集),“本地查询”。由于我们的许多频繁发出的查询在其结果集中有很大的交集,这可能会很快耗尽内存并使查询缓存变得无用。

我怀疑我错误地配置了 infinispan 或 hibernate 或两者,因为我似乎无法让 hibernate 2nd-level entity 缓存作为查询缓存的支持运行。我希望看到一个将 infinispan 作为 hibernate-as-JPA 2 级查询缓存的示例,其结果本身由 infinispan 作为 hibernate-as-JPA 2 级 entity 缓存提供支持。 p>

详情:

Hibernate 3.5 文档 (http://docs.jboss.org/hibernate/core/3.5/reference/en/html/performance.html#performance-querycache-enable) 声明:

查询缓存不缓存缓存中实际实体的状态;它只缓存标识符值和值类型的结果。出于这个原因,[原文如此]对于那些预期作为查询结果缓存的一部分缓存的实体,查询缓存应始终与二级缓存一起使用

但是,使用 infinispan(根据 http://community.jboss.org/wiki/usinginfinispanasjpahibernatesecondlevelcacheprovider)启用休眠级别 2 查询缓存,就像在我们的 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.region.factory_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory"/>
        <property name="hibernate.cache.infinispan.statistics" value="true"/>

检查 infinispan CacheManager JMX 属性仅显示 infinispan-configs.xml 中定义的六个 namedCache 之一(来自 GAV org.hibernate/hibernate-infinispan/3.5.6-FINAL,这取决于 GAV org.infinispan/infinispan -core/4.2.0.ALPHA1) 被创建,还有一个没有在那里定义:

org.hibernate.cache.UpdateTimestampsCache(created)
timestamps(not created)
entity-repeatable(not created)
entity(not created)
local-query(created)
replicated-query(not created)
replicated-entity(not created)

我怀疑上面引用的 jboss wiki 文章在讨论实体缓存时指的是 namedCache “实体”;但是,我找不到如何创建该缓存。 (旁白:我也担心 infinispan-configs.xml 的本地查询被创建但 infinispan-configs.xml 的时间戳不是;相反,我们收到一个 UpdateTimestampsCache 必须在休眠的其他地方定义。)指定

        <property name="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE"/>

在我们的 persistence.xml 然后注释相关实体 @javax.persistence.Cacheable 确实(根据 infinispan CacheManager JMX 属性)创建了实体缓存(命名为实体的包限定 java 类名),但它们即使 JMX 统计数据显示本地查询的命中率很高(实际上,这种缓存命中查询的性能惊人),似乎也没有使用。

我的担心是没有根据的吗?infinispan 是否只存储一次实体的信息,即使它在多个 HQL 查询的结果集中返回?如果不是,那么获取 infinispan-configs.xml 的 namedCache(用于避免实体数据重复存储的“实体”)的正确方法是什么?最后,如何使用infinispan-configs.xml的namedCache,“timestamps”,而不是“org.hibernate.cache.UpdateTimestampsCache”,作为hibernate二级时间戳缓存?

【问题讨论】:

    标签: hibernate second-level-cache query-cache infinispan


    【解决方案1】:

    事实证明,我的恐惧是没有根据的。这确实按照 Hibernate 文档的说明进行操作:查询缓存只返回实体标识符,然后 Hibernate 单独组装这些实体。

    我对 infinispan-configs.xml 的 namedCaches、“entity”和“timestamps”的困惑只是源于错误的期望。由于在 infinispan-configs.xml 中定义了 namedCache“local-query”,并且 CacheManager JMX 属性显示创建了一个名为“local-query”的缓存,我预计“timestamps”也是如此,并且, “实体。”事实并非如此。这些命名缓存将始终在 CacheManager JMX 属性中指示(未创建):时间戳、实体、实体可重复、复制查询和复制实体。尽管如此,这些namedCaches 的配置 得到尊重,但CacheManager JMX 属性中的名称将不匹配,这与“local-query”不同。相反,它们将是缓存区域名称:对于时间戳,“org.hibernate.cache.UpdateTimestampsCache”,对于实体,是实体的包限定 java 类名称。

    我还确定了为什么我的 2 级实体缓存区域的 JMX 统计信息中没有缓存命中,尽管这些区域正确支持查询缓存。我的测试和应用程序代码的设置方式是,查询缓存的结果集中返回的每个实体都已经在 PersistenceContext aka Session aka Hibernate Level-1 缓存中,因此在结果集的组装过程中,由于查询缓存命中,它们是从那里而不是从二级实体缓存区域提供的。

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 1970-01-01
      • 2014-10-18
      • 2021-12-26
      • 2016-03-30
      • 1970-01-01
      • 2020-07-03
      • 2016-10-27
      • 2021-11-04
      相关资源
      最近更新 更多