C# NHibernate保留打开的非活动会话

C# NHibernate保留打开的非活动会话,c#,oracle,nhibernate,fluent-nhibernate,C#,Oracle,Nhibernate,Fluent Nhibernate,我正在使用Nhibernate连接到Oracle 11g数据库。数据库管理员让我看一看这个程序,因为有很多非活动会话处于打开状态,显然这很快就会使服务器崩溃 为什么Nhibernate不关闭连接?下面是一个代码示例: public void Foo() { using (_sessionFactory = _Configuration.BuildSessionFactory()) using (_session = _sessionFactory.OpenSession())

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

为什么Nhibernate不关闭连接?下面是一个代码示例:

public void Foo()
{
    using (_sessionFactory = _Configuration.BuildSessionFactory())
    using (_session = _sessionFactory.OpenSession())
    {
        _session.Transaction.Begin();
        //DO STUFF
        _session.Transcation.Commit();
    }
}
我的印象是,处理session和sessionFactory将调用session.Close(),连接将被关闭


这只是连接池的工作吗?如果是的话,有没有一种方法可以设置连接池的最大大小?理想情况下,在fluent Nhibernate中?

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


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

问题似乎是由事务的使用引起的。从上述代码中删除事务会产生以下结果:

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

      //Do Stuff
      session.Flush();
  }
}
这似乎没有什么问题


但是,正如@LowFlyingPelican所建议的,我已将会话工厂的创建更改为在应用程序启动时进行。

您可以更改连接字符串中的池。@Fran ah我不知道,这是什么语法。如果我一次需要11个连接,并且最大池大小设置为10,会发生什么?请参阅此处()以获取连接字符串帮助。如果池中的所有连接都用光了,并且池本身增加了一个,那么可能会有11个连接。增量/减量大小可用于连接字符串以及最大池大小。@Fran啊,太好了,这只适用于Nhibernate?很抱歉问了一些基本问题,以前从未听说过这些设置。应该是这样的。请记住,nhibernate只是使用ado.net连接,这些都是连接字符串的有效选项。