繁体   English   中英

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

[英]No connections available in ADO.NET connections pool

我试图找出导致与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

谁能帮我吗?

using (oConnection) {

   oConnection.Open();

   // Your code here

   // No need to explicitly close or dispose

}

这段代码

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM