2010-11-25 165 views
0

我想弄清楚与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 

在性能管理,.NET数据提供程序的SQLSERVER,我可以看到“ NumberOfPooledConnections“和”NumberOfActivePooledConnections“始终低于连接字符串的最大池大小,始终在60到90个连接之间。

有没有人知道怎么可能?我得到了池中没有连接的例外情况,但是我可以看到池未满。

我的环境:

  • Windows Server 2003企业SP2(近期所有斑块)
  • IIS 6.0(在网页花园和应用程序池有4个工作进程每60分钟循环)
  • SQL服务器2005

有人能帮帮我吗?

回答

5
using (oConnection) { 

    oConnection.Open(); 

    // Your code here 

    // No need to explicitly close or dispose 

} 
+0

嗨Mahesh Velaga,我明白你的观点,但是,传感器显示的连接字符串的最大池大小是否正确? – user520488 2010-11-25 19:59:42

0

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

1

这段代码

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

不会处置()关闭的连接。我不确定这是否是问题,但应该修复。 Jusr使用n条件Dispose()或using() { }块。

0

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

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

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