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