2012-02-01 152 views
1

我已经NHibernate的迷上了在我的asp.net MVC应用程序做不好不要丢弃的Isession

的的Isession注入到存储库。 我无法使用会话每个请求模式,因为我需要每个会话的会话aproach。

NHibernate ISession用于多个http请求。对象图很大,我不想在每个请求中加载整个图。这就是为什么ISession存储在用户HttpSession中的原因。

所述的ISession的生命周期配置有StructureMap:

For<ISession>().LifecycleIs(new HttpSessionLifecycle()).Use(x => 
{ 
    var sessionSource = x.GetInstance<ISessionSource>(); 
    return sessionSource.CreateSession(); 
}); 

在对话结束时,我打电话

Session.Clear() 

清除的Isession。

当用户创建新对话时,StructureMap会创建一个新的ISession。 我没有找到一种处理ISession的方法。

所以它不好配置吗? 这是否保持与数据库的连接?

+0

如果它没有实现IDisposable那么......那么就没有Dispose()和Disposing它是没有意义的。文档说什么? – 2012-02-01 22:48:58

+0

ISession是一次性的,作为最佳实践应予以处置。但是,我的应用程序中的ISession必须跨越多个页面请求 – ms007 2012-02-01 22:59:33

+0

当您说因为您需要每个对话模式的会话而无法使用每个请求模式的会话时,是否表示您希望跨多个http请求保留会话用户?如果您可以更多地解释您的用例,那么了解您的问题会有所帮助。谢谢。 – 2012-02-02 02:38:26

回答

2

一般来说,NHibernate不会保持与DB的开放连接时间更长,那么它需要。它使用SQL Server连接池快速获取连接并返回它们。所以就开放连接而言,它不是一个不处理会话的问题。

但会议也保持在实体跟踪所有的变化和刷新他们在DB上物/提交事务,只需记住,这个功能是存在的,可能会追你

0

也知道约以下问题:

https://nhibernate.jira.com/browse/NH-3046

在某些情况下(如果不使用事务,或者如果你经常执行事务的回滚)长期生活会话可以“吃”了大量的内存。但所有分配的内存将在GC处理和收集会话时释放。