NHibernate在自动刷新事件上表现不佳?

首先我要说的是,我知道NH不建议使用批量操作。 但有点兴趣,我想知道为什么这么贵。 对于我系统中的200个对象,需要4分钟,其中90%以上的时间花在DefaultAutoFlushEventListener.OnAutoFlush上(感谢RedGate Profiler)。 那太疯狂了。 我想知道是否有人编写了一个自定义的DefaultAutoFlushEventListener,它可以暂时解决这个大型重复更新的问题。

更新:实际上不是批量更新的问题,而是事务和FlushMode查询的问题。 但是,当它冲洗时,NH到底在做什么呢?

这是一个很好的。 我在事务中进行了每次更新,并且在该事务中是一个查询,这是第二级缓存,但导致了刷新。 如果您在事务中有查询,并且FlushMode = Auto(基本上没有关闭),您将获得刷新。 这是非常昂贵的,特别是如果你在会话缓存中有很多对象,我们这样做。 将此查询移出事务,将查询时间增加了5倍。此外,使整个事务成为事务,而不是单个事务是另一个重要的推动因为每个transaction.commit导致刷新。 更新1000个对象只需不到30秒,而且我太尴尬了,不知道之前有多长时间。 啊遗留代码。

更新:进一步调查,我已将FlushMode设置为Commit,用于我们特定的嵌套事务模型。 在没有详细介绍的情况下,我们有一个特定的事务模型,在使用嵌套的“Logic”调用时会考虑嵌套事务。 对于遗留应用程序,我们不希望全面设置。 在这种情况下的具体问题是使用事务并将FlushMode设置为Auto(或Always)的组合。

虽然不建议将标准ISession用于批量操作,但您可以使用无状态会话或DML 。