NHibernate留下的未激活会话

本文关键字:激活 会话 NHibernate | 更新日期: 2023-09-27 18:09:28

我正在使用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?

NHibernate留下的未激活会话

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

当你使用连接池时,为每个会话工厂创建一个连接池,这似乎会导致不活跃的连接。

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

public class DoSomethingToDb(ISessionFactory sessionFactory)
{
  using (_sessionFactory = _Configuration.BuildSessionFactory())
  using (ISession session = sessionFactory.OpenSession())
  {
      //Do Stuff
      session.Flush();
  }
}

似乎没有什么问题。

然而,正如@LowFlyingPelican所建议的,我已经改变了会话工厂的创建,以便在应用程序启动时发生