我是NHibernate的新手,过早关闭 session 时遇到了一些问题。我已经通过重用 session 来临时解决此问题,而不是为每个事务打开一个 session 。但是,我给人的印象是,每次需要时都打开 session 是 session 生命周期管理的推荐方法。没有?
所以;建议处理 session 的方式是什么?他们的一生应该是什么?一期公关交易?一个单例 session 可以处理所有事情?还是什么?
编辑:
请注意,我的应用程序体系结构是与服务器端服务通信的桌面应用程序,这是所有使用NHibernate + Fluent处理数据库的工作。 (如果有什么不同...)
最佳答案
您需要一种 session 管理策略,该策略允许您的应用有效运行并利用NHibernate提供的功能-最值得注意的是缓存和延迟加载。
创建 session 是一个成本低廉的过程,几乎不需要前期RAM或CPU,因此您不必担心保存或重复使用 session (实际上,重复使用这些 session 可能会导致一些令人讨厌和无法预料的副作用)。 session 工厂是很昂贵的事情,应在应用程序启动时仅构建一次。
经验法则是这样的: session 生存期需要足够长,以使 session 结束后没有持久化对象卡在作用域中。
session 结束后,所有从该 session 获取的对象的更改跟踪都将停止,因此除非您将对象故意重新连接到新的 session ,否则不会保存这些更改。因此, session 应该一直存在,只要您从 session 中获取的对象将一直存在。在Web应用程序中,通常意味着每个请求都有一个 session 。在WinForms中,每个表单都有一个 session 。
在您的情况下,使用一项服务(我假设它在Windows服务上运行在Windows服务上运行)执行NHibernate工作,您可能希望考虑为使用中的桌面应用程序的每个新请求创建一个 session ,并在该请求有被服务。不知道确切地您的服务如何运行以及桌面应用程序用于与之对话的机制(远程处理?WCF?普通的老式SOAP?),我真的不能更具体地讲。
(此一般规则有一些异常(exception)情况-假设您有一组表示共享资源的持久对象,其他代码将引用该持久对象,但这些对象不会更改,您可以在应用程序启动时预先加载这些资源,然后将其断开连接上。)
如果您发现在这种策略下性能不佳,则可能是因为您与数据库的对话过多而对象图很复杂。在这种情况下,请查看second-level caching。
关于.net - NHibernate session 的生存期应该是多少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2013467/