【问题标题】:Prevent Fluent NHibernate select n+1防止 Fluent NHibernate 选择 n+1
【发布时间】:2010-10-09 12:48:43
【问题描述】:

我有一个相当深的对象图(5-6 个节点),当我遍历其中的一部分时,NHProf 告诉我我遇到了“选择 N+1”问题(我确实这样做了)。

我知道的两个解决方案是

  1. 急切的孩子
  2. 分解我的对象图(和急切加载)

我真的不想做这两个(尽管我可能会在以后将图表分开,因为我预计它会增长)

现在……

是否可以告诉 NHibernate(使用 FluentNHibernate)每当我尝试访问孩子时,一次性加载它们,而不是在我迭代它们时选择-n+1-ing?

我也得到了“无限的结果集”,这大概是同一个问题(或者更确切地说,如果可能的话,将通过上述解决方案来解决)。

每个子集合(在整个图表中)只会有大约 20 个成员,但 20^5 很多,所以我不想在获得根时急切加载所有内容,而只是获取所有的孩子每当我靠近它时收集。

编辑:事后诸葛亮......如果我想在渲染孩子时引入分页怎么办?我必须在这里打破我的对象图吗,还是我可以利用一些鬼鬼祟祟的方法来解决所有这些问题?

【问题讨论】:

    标签: nhibernate select fluent-nhibernate


    【解决方案1】:

    在我看来,您希望采用使用域模型的方法,而不是创建特定的休眠查询来处理这种情况。鉴于此,我建议您查看可以应用于您的集合的批量大小属性。 Fluent NHibernate fluent interface 尚不支持此属性,但作为一种解决方法,您可以使用:

    HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20")
    

    鉴于普遍缺乏有关您的确切场景的信息,我无法确定批量大小是否是理想的解决方案,但我当然建议您试一试。如果您还没有,我建议您阅读以下内容:

    http://www.nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

    http://nhibernate.info/doc/nhibernate-reference/performance.html

    NHibernate 性能文档将解释批量大小的工作原理。

    编辑:我不知道从您的域模型中分页的任何方式。我建议您为需要分页的场景编写 NH 查询。

    【讨论】:

    • “在我看来,您希望采用使用域模型的方法,而不是创建特定的休眠查询来处理这种情况。”肯定的。我想要的最后一件事是特定的查询。我会检查那些东西,ta
    • note -> fluent-nh 接口现在支持 BatchSize() 属性
    【解决方案2】:

    编辑:事后的想法....如果我 想在我需要的时候引入分页 渲染孩子?我必须打破吗 我的对象图在这里,或者有一些 我可以利用偷偷摸摸来解决所有问题 这些问题?

    好吧,如果你只加载孩子,那么你可以分页他们:)。但是如果你想要类似的东西: LoadParent AND PageChildren ,那么我认为你不能这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 2012-04-07
      • 2010-11-05
      • 2012-11-30
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多