我已经为使用Web和桌面应用程序构建了一个NHibernate基础架构。
但是,我想知道是否有必要在使用事务时使用FlushMode.Commit。
如果我在获取或创建ISession时有默认的FlushMode.Auto会有问题吗?
我已阅读以下内容:“将会话的刷新模式设置为Commit,以避免在使用事务时不必要地访问数据库。”。
但是,我希望有人向我保证,就功能而言,FlushMode.Auto也可以完成这项任务。
是否只是避免不必要的数据库访问的性能问题?
我可能会忍受它。
请给我你的光!
答案 0 :(得分:1)
不,没有必要更改刷新模式。如果不确定,请将其保留为Auto
。你会避免错误。
默认的刷新模式Auto
的工作原理如here所述:
ISession会不时执行所需的SQL语句 将ADO.NET连接的状态与状态同步 记忆中的物体。默认情况下,此过程为flush 以下几点
- 来自Find()或Enumerable()
的一些调用- 来自NHibernate.ITransaction.Commit()
- 来自ISession.Flush()
这个逻辑是为了确保查询数据库不会返回过时的数据,就当前事务的内容而言。
除非你明确表示Flush(),否则绝对没有保证 关于Session何时执行ADO.NET调用,只有订单执行 他们被执行了。但是,NHibernate确实保证了 ISession.CreateQuery(..)方法永远不会返回陈旧数据;也不 他们会返回错误的数据。
更改默认刷新模式可能会导致您在事务中的查询返回数据,而不会考虑先前在同一事务中执行的操作。
除非您非常确定不会因同一事务中后续查询返回的陈旧数据而被任何错误所困扰,否则最好将刷新模式保留为Auto
。
更改刷新模式以限制事务内部的SQL往返需要检查所有当前事务,并在查询需要考虑之前在事务中执行的操作之前向Flush
添加显式调用。然后希望任何新的发展也不会忘记这样做。因此,不仅您不一定会保存许多SQL往返,而且还会为bug创造新的机会。
我个人认为不值得更改默认刷新模式,以期减少SQL往返。特别是如果你没有检查它在你的申请的情况下是显着的还是微不足道的。