NHibernate打开了非活动会话

时间:2014-06-19 14:30:36

标签: c# oracle nhibernate fluent-nhibernate

我正在使用Nhibernate连接到Oracle 11g数据库。数据库管理员让我看看程序,因为有很多非活动会话被打开,显然这很快就会使服务器崩溃。

为什么Nhibernate没有关闭连接?以下是代码示例:

public void Foo()
{
    using (_sessionFactory = _Configuration.BuildSessionFactory())
    using (_session = _sessionFactory.OpenSession())
    {
        _session.Transaction.Begin();
        //DO STUFF
        _session.Transcation.Commit();
    }
}

我的印象是处理会话和sessionFactory会调用session.Close()并且连接将被关闭。

这只是连接池做它的工作吗?如果是这样,我可以设置连接池的最大大小?想要流利的Nhibernate吗?

2 个答案:

答案 0 :(得分:1)

查看代码,似乎您的代码允许创建多个会话工厂实例,最佳做法是只创建一个会话工厂。

当您使用连接池时,会为每个会话工厂创建一个连接池,这似乎会导致连接处于非活动状态。

答案 1 :(得分:0)

似乎问题是由交易的使用引起的。从上面的代码中删除事务产生了以下内容:

public class DoSomethingToDb(ISessionFactory sessionFactory)
{
  using (_sessionFactory = _Configuration.BuildSessionFactory())
  using (ISession session = sessionFactory.OpenSession())
  {

      //Do Stuff
      session.Flush();
  }
}

这似乎没有引起任何问题。

然而,正如@LowFlyingPelican建议的那样,我已经将会话工厂的创建更改为在应用启动时发生。