我的应用程序引起了很多麻烦。它是一个通过Web服务连接到SQL Server 2005的.NET应用程序。该程序具有由长时间运行的存储过程填充的网格,该存储过程易于超时。在超时且抛出SqlException的情况下,没有执行处理来关闭连接。
这种情况的实际后果是什么?我认为框架或SQL Server可能会以这种或那种方式处理它,但我不确定。
加成 该程序在早上总是运行良好,但在使用一个小时后它基本上停止工作。问题不在于我不知道如何正确编码连接。我需要知道这些症状是否可以被未闭合的连接所淹没。改变生产代码是一件大事,我想知道至少有可能成为问题。
结论 我设计了这种失败发生在数百个同时连接上。从来没有能够在应用程序环境中重现故障情况。标记的最佳实践回答正确。谢谢大家。
答案 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
}