8

バッチフェッチアルゴリズムのこの説明は、「Manning-Java PersistencewithHibernate」で見つかりました。

実際のバッチフェッチアルゴリズムとは何ですか?(...)バッチサイズが20で、バッチでロードする必要がある初期化されていないプロキシの総数が119であると想像してください。起動時に、Hibernateはマッピングメタデータを読み取り、11個のバッチローダーを内部で作成します。各ローダーは、初期化できるプロキシの数を知っています:20、10、9、8、7、6、5、4、3、2、1。目標は、ローダー作成のためのメモリ消費を最小限に抑え、可能なバッチフェッチを生成できます。もう1つの目標は、明らかにSQLSELECTの数を最小限に抑えることです。119個のプロキシを初期化するために、Hibernateは7つのバッチを実行します(6 x 20> 119であるため、おそらく6つを期待していました)。適用されるバッチローダーは、Hibernateによって自動的に選択される5回20、1回10、および1回9です。

しかし、私はまだそれがどのように機能するのか理解していません。

  1. なぜ11個のバッチローダー?
  2. バッチローダーが初期化できる理由:20、10、9、8、7、6、5、4、3、2、1プロキシ?

誰かが段階的なアルゴリズムを提示できるなら...:)

4

2 に答える 2

6

これにより、多数の異なるプリペアドステートメントが作成されるのを防ぐことができます。

各クエリ(プリペアドステートメント)を解析し、その実行プランを計算してデータベースにキャッシュする必要があります。このプロセスは、ステートメントがすでにキャッシュされているクエリの実際の実行よりもはるかにコストがかかる場合があります。

多数の異なるステートメントにより、他のキャッシュされたステートメントがキャッシュから削除され、アプリケーション全体のパフォーマンスが低下する可能性があります。

また、ハード解析は一般に非常にコストがかかるため、通常、新しいステートメントを解析して実行するよりも、キャッシュされた複数のプリペアドステートメント(複数のデータベースラウンドトリップを含む)を実行する方が高速です。したがって、さまざまなステートメントの数を減らすという明らかな利点に加えて、119個のIDすべてを含む単一の新しいステートメントを作成して実行するよりも、11個のキャッシュされたステートメントを実行して119個のエンティティすべてを取得する方が実際には高速です。

コメントですでに述べたように、HibernateはArrayHelper.getBatchSizesメソッドを呼び出して、指定された最大バッチサイズのバッチサイズを決定します。

于 2015-07-03T08:55:16.990 に答える
5

hibernateがバッチロードを処理する方法に関する情報をWebで見つけることができませんでしたが、あなたの情報から判断すると、次のように推測できます。

なぜ11個のバッチローダー?

バッチサイズが20の場合、プロキシの任意の組み合わせに必要なローダーの数を最小限に抑えたい場合は、基本的に2つのオプションがあります。

  • 1,2,3,4,5,6,7、... 20,21,22,23、... N個の初期化されていないプロキシのローダーを作成します(ばかげています!)または
  • 1..9の間の任意のNのローダーを作成してから、batch_size/2(再帰的に)のローダーをさらに作成します。

例:バッチサイズ40の場合、40,20,10,9,8,7,6,5,4,3,2,1ローダーのローダーになります。

  1. 初期化されていないプロキシが33個ある場合は、次のローダーを使用できます:20、10、3
  2. 初期化されていないプロキシが119個ある場合は、40(x2)、20、10、9のローダーを使用できます。
  3. ..。

バッチローダーが初期化できる理由:20、10、9、8、7、6、5、4、3、2、1プロキシ? 休止状態のチームは、初期化されていないプロキシの「一般的な」数Nをロードするために必要なローダーの数とメモリ消費量のバランスとしてこれを選択したと思います。は、0からまでのすべてのNに対してローダーを作成できた可能性がありますがbatch_size、ローダーにはかなりのメモリフットプリントがあると思われるため、これはトレードオフです。アルゴリズム次のようになります(知識に基づいた推測):

  1. n = batch_size; while (n > 10)

    1.1。loader(n); n = n / 2

  2. for n = 0..10 create loader(n)

于 2011-06-09T13:39:17.383 に答える