【问题标题】:nhibernate alternates batch sizenhibernate 交替批量大小
【发布时间】:2010-11-18 20:28:59
【问题描述】:

当使用 NHibernate 执行查询时,如果将批处理大小设置为大于实际返回的结果,则似乎不尊重批处理大小。

我正在使用最新版本的 NHibernate 2.1.0.4000 和 Linq to NHibernate 的 GA。我有一个类似于 Order 的对象结构,它有一个 OrderLine 集合。 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>

如果我查询 Orders 并返回 50 个结果,它会在单个查询中正确选择所有 OrderLines,但如果我返回的结果少于 50 个,它似乎不遵守定义的批量大小。

例如如果我得到 40 个结果而不是 50 个如果执行 3 个批量大小为 25、12 和 3 的查询

这看起来像是在尝试猜测要使用的正确批量大小(即,它先是批量大小的 1/2,然后是其余部分的 1/2,等等)。我希望它始终执行 50 的批量大小,如果数量较少,则将批量大小尽可能大,在本例中为 40 的批量大小。

如何让 NHibernate 尊重我在所有情况下定义的批量大小?

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    我被同样的奇怪行为绊倒了。 我发现人们在 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 然后使用这些准备好的语句来满足批量加载。 您在映射文件中指定为批处理大小的数字仅定义最大值。可能发生的批量大小。

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

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

    (以上数字是我在 NH 2.1 中的观察结果)

    这背后的原因:(根据链接的论坛讨论)
    担心当最大批量大小很大时创建许多不同的 PreparedStatement 对性能的负面影响。 (PreparedStatements 是一种 Java 结构,我想知道这种性能问题是否同样适用于 .NET)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2017-03-22
      • 1970-01-01
      • 2018-02-21
      • 2020-04-26
      • 1970-01-01
      相关资源
      最近更新 更多