2009-08-12 64 views
6

当使用NHibernate执行查询时,如果设置为大于实际返回的结果,则似乎不考虑批量大小。nhibernate替代批量大小

我正在使用最新版本的NHibernate 2.1.0.4000和Linq的NH到NHibernate。我有一个类似于Order的对象结构,它有一个OrderLines集合。该OrderLines已被定义为与下面的XML包:

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

如果我查询订单,并得到50个结果支持它正确地选择所有OrderLines在一个单一的查询,但如果我不到50个结果反馈它似乎没有尊重定义的批量大小。

E.g.如果我得到40个结果,而不是50,如果执行3批次大小为25,12和3的查询

看起来它似乎正在尝试猜测正确的批量大小使用(即它是批量的一半大小第一,然后是其余的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由Hibernate准备了几个SQL语句。每个都有一个固定的批量大小,用于定义IN子句中的参数个数。 Hibernate然后使用这些准备好的语句来满足批量加载。 您在映射文件中指定为批处理大小的编号仅定义了最大值。可能发生的批量大小。

例如给出batch-size = 1000。如果你有200个父实体并且想要加载它们的子集合,nHibernate决定使用4个语句:一个在IN子句中有125,62,10和3个参数(总计为200)。

但是,如果你只有125个父实体,那么hibernate决定只使用一个语句,即具有125个参数的语句。

(数字以上是我在NH 2.1意见)

这背后的原因:(根据链接的论坛讨论)
关注有关创建许多不同的预处理语句时的性能产生负面影响最大批量大。 (PreparedStatements是一个Java构造,我不知道这个性能问题是否同样适用于。NET)