ADO.NET 连接池中没有可用连接

问题描述 投票:0回答:4

我正在尝试找出生产环境中与ADO.NET连接池相关的异常数量不断增加的原因,我可以在日志中看到很多此类异常:

超时已过。超时时间 在获得之前已过去 来自池的连接。这可能 发生的原因是所有的 连接正在使用中并且最大池 已达到尺寸。

我尝试的第一件事是确保所有连接都已关闭并处置。为此,我们将所有数据库连接更改为:

try
{
     oConnection.Open();
     //do something
}    
catch()
{

}
finally
{
     if (oConnection.State != ConnectionState.Closed)
     {
         oConnection.Close();
         oConnection.Dispose();
     }
}

我正在使用以下连接字符串:

server=databaseserver;Database=databasename;User Id=username;Password=password;Max Pool Size=600;Min Pool Size=50;Connection Timeout=180;Pooling=true

在 Performance Manager、.NET Data Provider for SqlServer 中,我可以看到“NumberOfPooledConnections”和“NumberOfActivePooledConnections”始终低于连接字符串的最大池大小,始终在 60 到 90 个连接之间。

有谁知道这怎么可能?我遇到异常,池上没有连接,但我可以看到池未满。

我的环境:

  • Windows Server 2003 Enterprise SP2(包含所有最新补丁)
  • IIS 6.0(网络花园中有 4 个工作进程,应用程序池每 60 分钟回收一次)
  • SQL Server 2005

有人可以帮助我吗?

c# sql-server sql-server-2005 ado.net
4个回答
5
投票
using (oConnection) {

   oConnection.Open();

   // Your code here

   // No need to explicitly close or dispose

}

2
投票

这段代码

if (oConnection.State != ConnectionState.Closed)
{
     oConnection.Close();
     oConnection.Dispose();
}

不会 Dispose() 关闭的连接。我不确定这就是问题所在,但它应该得到解决。只需使用无条件 Dispose() 或

using() { }
块即可。


0
投票

状态可能已关闭,但连接仍未释放,因此您并未真正释放连接,请按照之前的建议使用 using 块。


0
投票

首先,SQL Server 允许的最大连接数设置与 ADO.NET .NET 连接池中允许的最大连接数设置不同。

其次,调用

SqlConnection.Close()
实际上并不关闭与SQL Server的连接。 它只是告诉连接池不再需要保持连接打开。 但是,连接池将使其保持打开状态一段时间,以防请求具有相同连接字符串的另一个连接请求。 要观察这一点,请在“关闭”连接之前和之后检查 SQL Server 的活动监视器。 您将看到 SQL Server 上的连接状态实际上正在休眠。

至于你的超时异常,我同意大家的建议,使用

using() { }
块。 最重要的是,如果您使用 SqlDataReader,请确保也关闭它。

© www.soinside.com 2019 - 2024. All rights reserved.