你想要一个会话管理策略,允许你的应用程序有效地运行并利用NHibernate给你的东西 - 最显着的是缓存和延迟加载。
创建会话是一个廉价的过程,需要很少的前期RAM或CPU,所以你不应该担心保存或重用会话(实际上,重新使用它们可能会导致一些令人讨厌和不可预料的一面效果 - )。会话工厂是非常昂贵的事情,应该在应用程序启动时一次性构建一次。
经验法则是:会话生存需要足够长,你没有持久对象徘徊范围在会话结束后。
一旦会话结束,所有的变化对于您从会议得到了目标跟踪停止,所以这些变化没有得到保存,除非你刻意该对象重新连接到一个新的会话。因此,只要您从中获取的对象将存在,该会话就应该存在。在Web应用程序中,通常表示每个请求的会话;在WinForms中,每个表单都有一个会话。您可能希望考虑为使用消费桌面应用程序的每个新请求创建一个会话,然后将其置于一个服务器上(我假设它运行的是作为Windows服务的)当该请求已被服务时。不知道你的服务是如何运行的,以及桌面应用程序使用什么机制来与它交谈(远程处理?WCF?普通的旧SOAP?)我不能更具体。
(这个通用规则有一些例外 - 假设您有一组代表一个共享资源的持久对象,其他代码将引用但不会更改,您可以在应用程序启动时加载这些预先并离开。他们从此断开)
如果你发现在这样的战略表现低迷,这可能是因为你只是谈话的数据库太多,你的对象图是复杂的;在这种情况下请看second-level caching。
在你的问题http://stackoverflow.com/questions/2011950/nhibernate-mappings-issue-when-referencing-class-lazy-load-issue你问我看看这个新的问题,但我看到你'已经得到了充分的报道。我在这里提出了一些意见,但请注意,会议和交易似乎混杂在讨论中,而这些意见是不同的。此外,会话池或超时触发的会话在性能方面可能是有益的,但是很难安装和正确使用。还要注意,无论您选择哪种模式,都会使用连接池。 – Abel 2010-01-06 23:42:46
感谢您的评论亚伯。在我看到的例子中,会话和事务经常共享相同的生命周期,但正如在引用的问题中看到的那样,这可能有时候会成为问题。我希望人们已经回答了“会话生命周期” - 而不是“事务生命周期”这是这种情况的印象。 – stiank81 2010-01-07 06:47:17