oracle服务器上的数据库连接未关闭

本文关键字:数据库连接 服务器 oracle | 更新日期: 2023-09-27 18:12:05

我遇到一个问题,当使用NHibernate连接到Oracle11g数据库时,池中的旧连接没有被关闭。

我很确定所有的NHibernate会话都被正确地处理了,但是连接仍然保持在INACTIVE状态。我知道这将是因为连接池,然而,他们应该在一定的时间后被删除吗?如果没有,我怎么配置它呢?

我尝试将以下设置添加到我的连接字符串中:

Max Pool Size=10;
Connection Lifetime=120;
Incr Pool Size=1;
Decr Pool Size=10;`

这似乎停止了许多正在创建的连接,我猜是因为这个增量大小是1,但是一旦连接被放回池中,它们就永远不会关闭。

我查看了v$session表,一些LASST_CALL_ET值高达786465秒或9天!!

我很确定所有的会话都被处理了,下面是一个示例代码:

public class DoSomethingToDb(ISessionFactory sessionFactory)
{
  using (ISession session = sessionFactory.OpenSession())
  {
      session.Transaction.Begin();
      //Do Stuff
      session.Transaction.Commit();
  }
}

如何设置我的程序/NHibernate/Ado。. Net/Oracle关闭不再使用的连接。

我们测试的服务器昨天崩溃了,因为有超过800个INACTVIE连接,没有更多的可以发出

oracle服务器上的数据库连接未关闭

出现问题的原因是您的Decr Pool Size值太大。由于Decr Pool SizeMax Pool Size相同,所以它将无法关闭任何连接,除非所有连接都可以关闭。

当我将此值设置为1时,它将永远释放未使用的连接。我目前将我的设置为5,每次减少之间仍然需要同样长的时间,但它会一次释放更多。

Pooling=true; 
Min Pool Size=0;
Max Pool Size=10;
Incr Pool Size=1;
Decr Pool Size=3;

同样,将Connection Lifetime设置为120,它将不会保持任何会话打开超过2分钟。

如果您可以在hibernate中这样做,我会感到惊讶,因为我认为连接是泄漏连接。由于某种原因,它们失去了控制,永远不会被重用。

可以在Oracle数据库的资源管理器中配置会话空闲超时。参见使用Oracle数据库资源管理器管理资源

确保为池化会话定义了资源消费者组,并且空闲超时足够大,不会意外中断正常工作的会话。

Oracle数据库资源管理器是一个非常灵活和强大的工具,可以在许多方面帮助您的系统。

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

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

这似乎没有什么问题。