错误后不关闭数据库连接有什么后果?

时间:2008-09-27 19:04:38

标签: .net sql sql-server sql-server-2005 web-services

我的应用程序引起了很多麻烦。它是一个通过Web服务连接到SQL Server 2005的.NET应用程序。该程序具有由长时间运行的存储过程填充的网格,该存储过程易于超时。在超时且抛出SqlException的情况下,没有执行处理来关闭连接。

这种情况的实际后果是什么?我认为框架或SQL Server可能会以这种或那种方式处理它,但我不确定。

加成 该程序在早上总是运行良好,但在使用一个小时后它基本上停止工作。问题不在于我不知道如何正确编码连接。我需要知道这些症状是否可以被未闭合的连接所淹没。改变生产代码是一件大事,我想知道至少有可能成为问题。

结论 我设计了这种失败发生在数百个同时连接上。从来没有能够在应用程序环境中重现故障情况。标记的最佳实践回答正确。谢谢大家。

7 个答案:

答案 0 :(得分:5)

由于SqlConnection在处理时关闭,我通常使用这种语法

using (SqlConnection conn = new SqlConnection())
{
  // SqlCode here 
}

答案 1 :(得分:2)

有连接限制;如果您的应用频繁崩溃并且未自动关闭连接,则新连接请求将被拒绝。

那就是说,如果他们没有关闭,连接会在一段时间后超时。

答案 2 :(得分:1)

如果应用程序在一小时左右后停止工作,那肯定是由于未关闭/处置的连接造成的。

答案 3 :(得分:1)

这就是使用ADO.Net

时'using'关键字非常重要的原因
 using ( SqlConnection conn = new SqlConnection() )
 {
     ...
 }

这会使用IDispose接口强制ADO.Net对象上的一种确定性垃圾回收。

大多数数据库代码为此目的使用了大量嵌套的“using”子句。

答案 4 :(得分:0)

如果经常发生连接,你可能会用尽可用的连接,你应该在执行命令的任何地方使用最终关闭连接。

答案 5 :(得分:0)

垃圾收集器最终将最终确定您的打开连接对象,但您不知道下一次GC何时出现。如果您有大量流量或者它是共享的SQL服务器,那么在此之前您可能会耗尽池中的连接。

为什么不将它丢弃在try / catch块的finally部分?

finally
{
   if (cn != null)
   {
      cn.Dispose();
      cn = null;
   }
}

这应该在Web服务方法中完成。

答案 6 :(得分:0)

try
{
    sqlCommandObject.Execute(); // this line will throw a timeout exception
}
finally
{
    sqlConnectionObject.Close(); // this will execute no matter what happens
}