【问题标题】:Does the Hibernate Query Cache work in Dom4J modeHibernate Query Cache 是否在 Dom4J 模式下工作
【发布时间】:2012-03-15 02:24:47
【问题描述】:

背景:我们的项目团队正在使用 Hibernate 的 dom4j 实体模式为多个客户端应用程序生成 SOAP 响应。交付的数据量很大,响应时间是一个问题。我们可以通过使用 Hibernate Query Cache 和/或 2nd Level Cache 来显着减少 SQL 调用的数量。由于我们系统的架构,一级缓存(会话)级别的机制不会像 SessionFactory 的查询缓存那样提高性能。

问题:根本问题是 Hibernate 的 DOM4J Entity 模式是否兼容 Query 缓存。查询结果被放入查询缓存中。但是,当执行query.list() 方法并找到匹配的缓存查询时,会抛出以下异常:

引起:

java.lang.ClassCastException: org.dom4j.tree.DefaultElement cannot be cast to java.math.BigDecimal
      at org.hibernate.type.descriptor.java.BigDecimalTypeDescriptor.extractHashCode(BigDecimalTypeDescriptor.java:36)
      at org.hibernate.type.AbstractStandardBasicType.getHashCode(AbstractStandardBasicType.java:197)
      at org.hibernate.type.AbstractStandardBasicType.getHashCode(AbstractStandardBasicType.java:192)
      at org.hibernate.engine.EntityKey.generateHashCode(EntityKey.java:126)
      at org.hibernate.engine.EntityKey.<init>(EntityKey.java:70)
      at org.hibernate.type.ManyToOneType.scheduleBatchLoadIfNeeded(ManyToOneType.java:160)
      at org.hibernate.type.ManyToOneType.beforeAssemble(ManyToOneType.java:246)
      at org.hibernate.cache.StandardQueryCache.get(StandardQueryCache.java:143)
      at org.hibernate.loader.Loader.getResultFromQueryCache(Loader.java:2361)
      at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2309)
      at org.hibernate.loader.Loader.list(Loader.java:2268)
      at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
      at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
      at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
      at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
      at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)

我们的环境是 Core-Spring/Hibernate...

在我们的spring-hibernate会话工厂配置中,使用了如下配置:

<prop key= "hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>
<prop key= "hibernate.cache.region.factory_class"> net.sf.ehcache.hibernate.EhCacheRegionFactory</prop>
<prop key="hibernate.cache.query.factory_class"> org.hibernate.cache.StandardQueryCacheFactory</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.cache.use_structured_entries">true</prop>

初步分析:我的直觉是,Hibernate 的“实验性”DOM4J 实体模式与查询和实体缓存不兼容。还需要注意的是,我们的 Hibernate hbm.xml 映射文件使用动态映射。即映射文件没有类引用;相反,它们有实体引用。因此,无需填充类的对象即可直接生成 XML 响应。

如果能在这件事上提供任何帮助,我将不胜感激。

【问题讨论】:

    标签: hibernate ehcache dom4j query-cache


    【解决方案1】:

    所以,经过多次尝试,我发现了问题。

    上面的初步分析是关键。当代码以动态映射模式生成 XML 时,ehcache 水合机制不起作用。解决该问题的解决方案是创建一个类文件来支持休眠映射。也就是说,当您使用带有指向类的名称属性的休眠映射 (hbm.xml) 文件时,一切都很好。 Hibernate 可以对类进行水合,然后以 dom4j 实体模式生成 XML。

    我在类标签中使用了一个实体名称属性。我的代码试图直接对 XML 进行水合。如上所示,这失败了。

    所以,我希望这个解决方案有人一段时间。

    【讨论】:

      猜你喜欢
      • 2011-08-14
      • 2020-06-14
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2013-06-03
      • 2021-12-07
      相关资源
      最近更新 更多