NHibernate - Session Singleton C#

时间:2010-12-03 14:30:23

标签: c# nhibernate session singleton

尝试将NHibernate迁移到现有的C#WinForms应用程序中,我目前正在寻找管理会话的最佳方法。我只是在学习NHibernate所以请原谅我缺乏知识,有人可以提供我们可以使用的任何会话管理代码,我们发现的大多数实现都是针对网络应用程序。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

假设您已经熟悉XML和NHibernate配置本身,那么您需要创建一个单独的对象,即ISessionFactory API。这应该成为单例的原因是关于连接的完整配置以及所有实体映射都加载到内存中,以便NHibernate知道如何以及在何处持久保存到底层数据存储区。因此,ISessionFactory API实例化成本非常高。

对于会话,无论您是想要无状态会话还是有状态会话,都需要考虑两个方面。这个选择完全属于你,但要知道其中的区别。

ISession API会跟踪附加实体的每个更改。附加实体是使用NHibernate提供的一种可能方式从基础数据存储区加载的实体,或者另一方面,是刚刚实例化并且您已将自己附加到会话的瞬态实体。为工具保持这样的状态会话可能会导致数据丢失,因为此API会在内存中泄漏。一旦发生泄漏,整个更改跟踪将被删除,并且无法再使用该会话。 ISession API应始终与ITransaction API一起使用。 ITransaction可能与SQL中的Begin Transaction直接相同(TSQL,PL / SQL等)。每当您需要持久保存到数据库中时,您应该在使用事务时这样做,以防止错误使更改无效或无论如何。 ISession API应该在工作单元的开头实例化。一次只能处理多个表单,可能只需要一个ISession API实例。也就是说,对于内存管理原因,使ISession API实例成为单例是一个非常非常糟糕的主意,ISession会跟踪附加实体发生的每个更改。保持ISession API存活时间过长会导致它使用越来越多的内存,这会导致内存泄漏,并导致会话丢失。

IStatelessSession API实现了它所说的功能。作为无状态,它不会跟踪对附加对象所做的任何更改。因此,您必须手动知道要执行的操作是针对您要保留的此实体的数据库操作。 IStatelessSession还使用ITransaction API来处理数据完整性。连接到数据存储区时,这两者应始终相互使用。 IStatelessSession通常在创建时根据需要使用,因为除了与数据存储区“对话”之外没有其他用途。我相信,这个API主要用于无状态统治最多的Web应用程序。

ISessionIStatelessSesion API之间选择最符合您要求的内容后,您就可以开始使用了。