使用NHibernate执行查询时,如果将其设置为大于实际返回的结果,则似乎不尊重批量大小.
我正在使用最新版本的NHibernate 2.1.0.4000和Linq的GA到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>
Run Code Online (Sandbox Code Playgroud)
如果我查询Orders并获得50个结果,它会在单个查询中正确选择所有OrderLines,但如果我得到的结果少于50个,那么它似乎不符合定义的批量大小.
例如,如果执行3次查询,批量大小为25,12和3,则返回40个结果而不是50个
看起来它试图猜测要使用的正确批量大小(即它首先是批量大小的1/2,然后是剩余的1/2等).我希望它一直执行50的批量大小,如果少,那么批量大小尽可能大,在这种情况下批量大小为40.
如何让NHibernate尊重我在所有情况下定义的批量大小?
jba*_*ndi 11
我绊倒了同样奇怪的行为.我发现人们在Hibernate(Java)中也遇到了同样的问题.
这里记录了Hibernate的行为:
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
我猜这种行为是直接从Hibernate移植的.
简而言之:
Hibernate准备的批处理功能只有几个SQL语句.每个都有一个固定的批量大小,它定义了IN子句中的参数计数.然后,Hibernate使用这些准备好的语句来满足批量加载.您在映射文件中指定为批量大小的数字仅定义最大值.可能发生的批量大小.
例如,给定batch-size = 1000.如果你有200个父实体并且想要加载这些子实例,那么nHibernate决定使用4个语句:一个在IN子句中有125,62,10和3个参数(总计最多200个).
但是,如果您只有125个父实体,那么hibernate决定只使用一个语句,一个包含125个参数.
(以上数字是我在NH 2.1中的观察结果)
这背后的原因:(根据链接的论坛讨论)
关注当最大批量大时创建许多不同的PreparedStatements会对性能产生负面影响.(PreparedStatements是一个Java构造,我想知道这个性能问题是否对.NET同样有效)
| 归档时间: |
|
| 查看次数: |
1925 次 |
| 最近记录: |