1

背景: 私たちのプロジェクト チームは、Hibernate の dom4j エンティティ モードを使用して、複数のクライアント アプリケーションの SOAP 応答を生成しています。配信されるデータ量は膨大で、応答時間が問題になります。Hibernate Query Cache や 2nd Level Cache を使用することで、SQL 呼び出しの数を大幅に減らすことができます。私たちのシステムのアーキテクチャにより、第 1 レベル キャッシュ (セッション) レベルのメカニズムは、SessionFactory でのクエリ キャッシュが機能する方法ではパフォーマンスを向上させません。

質問: 根本的な質問は、Hibernate の DOM4J エンティティ モードがクエリ キャッシュと互換性があるかどうかです。クエリ結果はクエリ キャッシュに入れられています。ただし、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 応答は、クラスのオブジェクトを設定せずに直接生成されます。

この件に関してご支援をいただければ、非常に感謝いたします。

4

1 に答える 1

0

そのため、何度も試行した後、問題を発見しました。

上記の初期分析が鍵でした。コードが動的マッピング モードで XML を生成した場合、ehcache ハイドレーション メカニズムは機能しません。この問題を解決する解決策は、休止状態のマッピングをサポートするクラス ファイルを作成することでした。つまり、クラスを指す name 属性を持つ hibernate マッピング (hbm.xml) ファイルを使用すると、すべてがうまくいきます。Hibernate はクラスをハイドレートしてから、dom4j エンティティ モードで XML を生成できます。

class タグで enity-name 属性を使用していました。私のコードは、XML を直接水和しようとしていました。これは上記のように失敗しました。

だから、私はこの解決策がいつか誰かを願っています。

于 2012-02-25T06:04:18.703 に答える