【问题标题】:Why is NHibernate AutoFlush check so expensive?为什么 NHibernate AutoFlush 检查如此昂贵?
【发布时间】:2019-01-16 22:48:03
【问题描述】:

实际上,我们发现默认的 NHibernate (v2.0 & 2.1) FlushMode=Auto 非常昂贵。查看 NHibernate 源代码表明,用于确定需要刷新哪些内容的算法依赖于遍历会话中所有实体的蛮力循环,并且在事务中运行的每个查询都会发生这种情况。

在一些需要更新许多项目的生产场景中,通过多个查询,我们看到 FlushMode=Auto 的过程比 FlushMode=Commit 长 100 倍。

在执行涉及多个更新、多个查询等的“复杂”会话逻辑时使用 FlushMode 的任何想法/建议/最佳实践。

关于优化 nHibernate 中的 AutoFlush 算法有什么想法吗?

【问题讨论】:

标签: nhibernate


【解决方案1】:

这种缓慢是一个已知问题,在 NH 中被跟踪为NH-1365/GitHib Issue 857

NH共有三种冲水模式:

  • FlushMode.Auto = 在需要时刷新(如果需要,在提交和查询之前)。这是默认设置。
  • FlushMode.Commit = 仅在提交 NH 事务时刷新
  • FlushMode.Never = 从不刷新(直到调用 Flush)。这将 still go to DB 插入使用本机(身份)PK 生成器的实体。

【讨论】:

  • 谢谢,很高兴知道这是一个已知问题。很遗憾知道这是一个超过一年的已知问题!我很欣赏有很多方法可以重新安排代码以限制执行的刷新次数。尽管如此,Nhibernate 中的刷新性能似乎比应有的要慢得多。
  • 还有FlushMode.Always:在执行任何查询之前刷新会话,代价高昂的weblogs.asp.net/ricardoperes/nhibernate-pitfalls-flush-mode。还有FlushMode.Unspecified,这是一个特殊的空值;不确定它是否真的可以使用。
猜你喜欢
  • 1970-01-01
  • 2015-07-12
  • 2011-05-03
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 2017-06-04
相关资源
最近更新 更多