【发布时间】: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