处理ISession是不好的

时间:2012-02-01 22:44:25

标签: nhibernate

我已经在我的asp.net mvc应用程序中连接了NHibernate

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

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

使用StructureMap配置ISession的生命周期:

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

在对话结束时我打电话

Session.Clear()

清除ISession。

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

不处理它是不是很糟糕? 这是否与数据库保持连接?

2 个答案:

答案 0 :(得分:2)

一般情况下,NHibernate不会长时间保持与DB的开放连接。它使用SQL Server连接池快速获取连接并返回它们。因此,在开放连接方面,不存在处理会话的问题。

但是会话还跟踪实体中的所有更改,并在处理/提交事务中的DB中刷新它们,请记住这个功能在那里并且可能会追逐你

答案 1 :(得分:1)

还要注意以下问题:

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

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