4

MySQL データベース上の ORM レイヤーとして Hibernate を使用します。かなりの数のモデル オブジェクトがあり、その中には (フィールド数などの点で) 非常に大きいものもあります。一部のクエリでは、モデル オブジェクトに対してさまざまな計算を行うために、(すべてではないにしても) 多くのモデル オブジェクトをデータベースから取得する必要があります。

遅延読み込みを有効にしていますが、場合によっては、Hibernate がオブジェクトを設定するのにかなりの時間がかかります。MySQL クエリの実行時間は非常に高速 (数ミリ秒程度) ですが、Hibernate はオブジェクトにデータを入力するのにかなりの時間を要します。

このプロセスを高速化する方法/パターン/最適化はありますか?

ありがとう。

4

3 に答える 3

2

1 つのアプローチは、エンティティではなく、ある種のビュー オブジェクトを設定することです。

CustomerView に適切なコンストラクターがあると仮定すると、次のことができます。

select new CustomerView(c.firstname, c.lastname, c.age) from Customer c

ただし、関連付けられたオブジェクトをたまたまカスケードでロードして、適切なフェッチをいくつか忘れない限り、Hibernate がオブジェクトを生成するのが遅いことに少し驚いています。

于 2011-06-03T08:49:14.987 に答える
1

おそらく、第2レベルのキャッシュを追加することを検討しますか?これは必ずしもオブジェクトのインスタンス化を高速化するわけではありませんが、それを行う必要がある頻度を大幅に減らすことができます。

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html

于 2011-06-03T16:26:25.500 に答える
1

パフォーマンス関連の質問をしているため、ボトルネックがどこにあるかについてさらにデータを収集する必要がある場合があります。あなたは言う

Hibernate は、オブジェクトを設定するのに少し時間がかかります。

問題が Hibernate であることをどうやって知ることができますか? 言い換えれば、Hibernate 自体に問題があるのでしょうか、それともメモリが不足している (または多すぎる) ため、JVM が効率的に実行されていないのでしょうか?

また、あなたは言及します

かなりの数のモデル オブジェクトがあり、その中には (フィールド数などの点で) 非常に大きいものもあります。

「かなり大きい」とはいくつですか?数十?何百?数千?テーブルが「広く」なるにつれて、リレーショナル データベース (MySQL など) のパフォーマンスが低下し始めるため、大きな違いが生じます (この質問を参照してください:テーブルに列が多すぎる場合、パフォーマンスが低下しますか? )。

パフォーマンスは、制約のバランスをとることが重要ですが、多くのデータを収集して問題がどこにあるかを確認し、その問題を修正することも重要です。次に、次のボトルネックを見つけて、パフォーマンスが十分に向上するか、実装時間がなくなるまで、そのボトルネックを修正します。

于 2011-07-30T21:03:17.450 に答える