为什么NHibernate在执行查询之前进行级联?
因此,我使用为什么NHibernate在执行查询之前进行级联?,nhibernate,Nhibernate,因此,我使用Nhibernate.LinqAPI来运行查询。查询本身只需要大约50毫秒,但NHibernate返回结果所花费的总时间约为500毫秒 查询如下所示,session.query().Where(i=>i.ForeignKey==someValue)。Take(5.ToList().AsQueryable()。从创建HQLQueryPlan的调试日志中,通过设置参数、打开连接、水合C#对象和完成,该查询在不到50毫秒的时间内执行 然而,在它开始这么做之前,调试日志显示NHibernat
Nhibernate.Linq
API来运行查询。查询本身只需要大约50毫秒,但NHibernate返回结果所花费的总时间约为500毫秒
查询如下所示,session.query().Where(i=>i.ForeignKey==someValue)。Take(5.ToList().AsQueryable()
。从创建HQLQueryPlan
的调试日志中,通过设置参数、打开连接、水合C#对象和完成,该查询在不到50毫秒的时间内执行
然而,在它开始这么做之前,调试日志显示NHibernate花费了约400毫秒的时间来级联保存和更新,然后报告了一组找到的集合:
日志,这些日志似乎是我所请求的对象的集合
属性。我应该补充的是,正在使用的I会话
是只读的,并且绝对没有修改或创建任何实体。在花费这400毫秒之后,它会记录它刷新了0个更改
为什么NHibernate在执行
.Query()
的过程中级联了大量的save/update命令,它是在试图确保检索到正确的数据吗?这是我设置的某些配置的结果吗?只有在事务内部执行的查询以及以下情况下才可能出现这种行为:
- 您已将FlushMode设置为
FlushMode。始终
- 或NHibernate检测到您的查询涉及在当前会话中修改的表。通过将FlushMode设置为小于
(这是默认值)(因此它是FlushMode.Auto
或FlushMode.Commit
)的值,可以禁用此行为FlushMode.Manual
您可以更改会话的刷新模式,或在
default\u flush\u mode
配置设置中指定默认刷新模式。有关详细信息,请参见我已为此会话设置了FlushMode.Never
(以前是FlushMode.Auto
),这解决了刷新问题。然而,这个会话是只读的(这就是为什么我可以设置这个刷新模式),所以我不确定NHib为什么会这样做……也许是因为这个会话正在参与一个事务?虽然包装事务也是只读的…但它也会每次刷新,因此如果我重复运行查询,则重复刷新“nothing”需要整整400毫秒…FlushMode.
在最新版本中已过时。您应该使用FlushMode.Manual
。是的,看来NHibernate应该跳过只读会话的自动刷新逻辑,但它不。。。