2013-07-02 10 views
10

hibernateの@BatchSizeアノテーションは、遅延読み込みエンティティのバッチフェッチを可能にします。例えば。私のようなものだ場合:遅延読み込み関係ごとに@BatchSizeを使用しないのはなぜですか?

public class Product { 


    @OneToMany(fetchType=LAZY) 
    @BatchSize(size=10) 
    private ProductCategory category; 

} 

を、私は、製品のカテゴリを得れば今、Hibernateは現在のセッションであり、まだそのカテゴリフィールドが初期化されていたされていない10のまでより多くの製品のカテゴリを取得します。これにより、大量のSQLコールがデータベースに保存されます。ここまでは順調ですね。 なぜ@BatchSizeアノテーションをすべての遅延読み込み関係で使用しないのでしょうか?結局のところ、なぜデータベースへの追加呼び出しが必要なのでしょうか?明らかにこれに理由がなければなりません。さもなければ、Hibernateの人はそれをデフォルトにすることができましたが、私は現在それを見ることができません。

+0

ちょっとした修正です。 "バッチフェッチを設定するには、クラスレベルとコレクションレベルの2つの方法があります。"([docs])(http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance。 html#performance-fetching-batch)。したがって、 'Product.category'クラスではなく' ProductCategory'クラスに '@BatchSize'を置くべきです。 –

答えて

14

私はあなたの質問に直接答えるつもりはありませんが、私はより一般的な質問に答えるつもりです。「私はもっと速く働く何かを見つけました。どこにでも適用してみませんか?

短い答えは次のとおりです。プリエンプティブな最適化を行うべきではありません。

hibernateはあらゆる種類の最適化を可能にするすばらしいORMです。問題の原因となるすべてのプロセス(高速であっても古典的なN+1、遅いプロセスなど)を測定し、それを解決するために最適化する必要があります。

いつも使っているのでいくつかのプロパティをロードする方がずっと良いパフォーマンスが得られるかもしれませんが、あなたはそのプロパティに対して持っているリレーションの数について知っているので、BatchSizeが100になる必要があります。

最終的には、にはが必要ですが、最終的に最適化に気を付ける必要はありません。そして測定をして問題を発見したときに気を付ける必要があります。

7

@BatchSizeアノテーションをすべての遅延読み込み関係に使用しないのはなぜですか?

最適化であるため、すべての場合に必要でない場合があります。このようなバッチフェッチは、アプリケーションが多くの異なるproductsのためにproduct.categoryにアクセスする場合に便利です。そのため、N個ではなく1つのselect from category...クエリを実行できます。アプリケーションが1 Product例えばproduct.categoryにアクセスしたときに

しかし、同じセッションで他のProductインスタンスのcategoryフィールドにアクセスする可能性は低いものですか?そのアソシエーションに対して@BatchSizeが有効になっている場合は、他の多くのCategoryインスタンスをセッションにロードするだけで、何も得られません。これらは使用されません。

関連する問題