C# ADO.NET连接池中没有可用的连接

C# ADO.NET连接池中没有可用的连接,c#,sql-server,sql-server-2005,ado.net,C#,Sql Server,Sql Server 2005,Ado.net,我试图找出与ADO.NET连接池相关的生产环境中异常数量不断增加的原因,我在日志中看到了大量此类异常: 超时已过期。超时时间 在获得 来自池的连接。今年五月 已发生,因为所有 连接正在使用,最大池数 尺寸已达到 我尝试的第一件事是确保所有连接都已关闭并释放。为此,我们将所有数据库连接更改为: try { oConnection.Open(); //do something } catch() { } finally { if (oConnection.St

我试图找出与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(每60分钟在web garden和应用程序池中回收4个工作进程)
  • SQL Server 2005

有人可以帮我吗?

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

状态可能已关闭,但连接仍未释放,因此您没有真正处理连接,按照前面的建议使用using块。

这段代码

using (oConnection) {

   oConnection.Open();

   // Your code here

   // No need to explicitly close or dispose

}
if (oConnection.State != ConnectionState.Closed)
{
     oConnection.Close();
     oConnection.Dispose();
}
不会处理()已关闭的连接。我不确定这是否是问题所在,但应该解决。Jusr使用条件Dispose()或
using(){}
块。

这段代码

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

不会处理()已关闭的连接。我不确定这是否是问题所在,但应该解决。Jusr使用conditional Dispose()或
using(){}
块。

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

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


至于超时异常,我同意大家的建议,使用
using(){}
块。除此之外,如果您使用的是SqlDataReader,请确保您也关闭了它。

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

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


至于超时异常,我同意大家的建议,使用
using(){}
块。最重要的是,如果您使用的是SqlDataReader,请确保您也关闭了它。

嗨,Mahesh Velaga,我明白你的意思,但是,传感器显示的连接数小于连接字符串中的最大池大小,这对吗?@user520488查看@bitxwise-answer,我还认为其中一些(连接)是正确的处于休眠状态且未被解释(但实际上未被处理)。嗨,Mahesh Velaga,我明白你的意思,但是,传感器显示的连接数是否小于连接字符串中的最大池大小?user520488看看@bitxwise answer,我还认为其中一些(连接)处于休眠状态且未被解释(但实际上没有被处置)。