【问题标题】:Inactive sessions left open by NHibernateNHibernate 保持打开的非活动会话
【发布时间】:2014-06-19 14:30:36
【问题描述】:

我正在使用 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() 并且连接会关闭。

这只是连接池的工作吗?如果是这样,有没有办法可以设置连接池的最大大小?最好是流利的 Nhibernate?

【问题讨论】:

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

标签: c# oracle nhibernate fluent-nhibernate


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    这似乎不会导致任何问题。

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

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 2019-12-05
      相关资源
      最近更新 更多