2009-08-12 3 views
6

NHibernateでクエリを実行すると、結果が実際に返される結果以上に設定されているとバッチサイズを尊重しているように見えません。nhibernateはバッチサイズを変更します

私は最新バージョンのNHibernate 2.1.0.4000とLinqのGAをNHibernateに使用しています。私は、OrderLineのコレクションを持つOrderと似たオブジェクト構造を持っています。私が注文を照会および50件の結果が戻って取得した場合、それは正しく、単一のクエリ内のすべての注文ラインを選択

<bag name="OrderLines" access="field.camelcase" table="MyDatabase.OrderLines" lazy="true" batch-size="50"> 
    <key column="OrderId"/> 
    <one-to-many class="OrderLine"/> 
</bag> 

が、私は50未満の結果を取り戻す場合:注文ラインは、次のXMLでバッグのように定義されています定義されたバッチサイズを尊重するようには見えません。

など。バッチサイズが25,12、および3の3つのクエリを実行する場合、50の代わりに40の結果を返す場合

正しいバッチサイズを推測しようとしているようですまずサイズ、残りの1/2など)。私はいつでもバッチサイズ50を実行することを期待しています。バッチサイズをできるだけ大きくすると、この場合バッチサイズは40になります。

NHibernateをどのように尊重することができますか私がすべてのケースで定義したバッチサイズ?

答えて

10

私は同じ奇妙な振る舞いにつまずきました。 私は、人々がHibernate(Java)でも同じことにつまずいていることが分かりました。動作が休止状態のためにここに文書化されて

http://opensource.atlassian.com/projects/hibernate/browse/HB-1457
https://forum.hibernate.org/viewtopic.php?p=2233747#2233747
https://forum.hibernate.org/viewtopic.php?p=2422139

私は、この動作は休止状態から直接移植されると思います。

要するに


休止することにより調製バッチfechtingのための少数のSQL文があります。それぞれは固定括弧サイズで、IN句のパラメータ数を定義します。 Hibernateは、バッチロードを満たすためにこれらの準備済みの文を使用します。 マッピングファイルでbatch-sizeとして指定した数値は、max。バッチサイズが発生する可能性があります。

たとえば、バッチサイズ= 1000の場合。 200個の親エンティティがあり、これらの子コレクションをロードしたい場合、nHibernateはIN節に125,62,10、および3個のパラメータを持つステートメント(合計200個まで)を使用することを決定します。

しかし、125の親エンティティしか持たない場合、hibernateは125パラメータを持つ文を1つだけ使用することを決定します。

(上記の数字はNH 2.1での私の観察されている)

この背後にある理由:(リンクフォーラムの議論に応じて)
際に、多くの異なるPreparedStatementsの作成の負のパフォーマンスへの影響についての懸念最大バッチサイズが大きい。 (PreparedStatementsはJavaのコンストラクトですが、このperformaceの懸念事項が同様に有効かどうかは疑問です。NET)

関連する問題