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

时间:2010-11-25 18:05:10

标签: c# sql-server sql-server-2005 ado.net

我正在尝试找出与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,SqlServer的.NET数据提供程序中,我可以看到“NumberOfPooledConnections”和“NumberOfActivePooledConnections”始终低于连接字符串的最大池大小,始终在60到90个连接之间。

有谁知道怎么可能?我得到的例外是游泳池上没有连接,但我可以看到游泳池没有满。

我的环境:

  • Windows Server 2003 Enterprise SP2(包含所有最新补丁)
  • IIS 6.0(Web园中有4个工作进程,App Pool每60分钟回收一次)
  • SQL Server 2005

愿任何人帮助我吗?

4 个答案:

答案 0 :(得分:5)

using (oConnection) {

   oConnection.Open();

   // Your code here

   // No need to explicitly close or dispose

}

答案 1 :(得分:1)

这段代码

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

不会Dispose()一个Closed连接。我不确定这是问题,但应该修复。 Jusr使用nconditional Dispose()或using() { }块。

答案 2 :(得分:0)

状态可能已关闭,但连接仍未处理,因此您实际上没有处理连接,请按照之前的建议使用using块。

答案 3 :(得分:0)

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

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

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