为什么不在finally块中关闭数据库连接

时间:2009-06-26 15:22:13

标签: c# .net sql-server database

主要编辑: 我误读了这篇文章!评论是关于类的finalize方法而不是finally块:)。道歉。

我刚刚读到你不应该在finally块中关闭或处理数据库连接,但文章没有解释原因。我似乎无法找到一个明确的解释,为什么你不想这样做。

Here is the article

6 个答案:

答案 0 :(得分:13)

如果你环顾四周,关闭finally块中的连接是推荐的方法之一。您正在查看的文章可能建议在使用该连接的代码周围使用“using”语句。

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = connection.CreateCommand();

    command.CommandText = "select * from someTable";

    // Execute the query here...put it in a datatable/dataset
}

'using'语句将确保Connection对象在需要之后立即处理,而不是等待垃圾收集器处理它。

答案 1 :(得分:4)

我不同意你不应该在finally块中关闭或处理数据库连接。

如果有大量活动,让未处理的(甚至是处理过的)异常保持打开连接可以很快地删除数据库。

关闭数据库连接是为什么要使用finally语句恕我直言的事实示例。当然,using语句是我首选的方法,也许是原作者的目标。

编辑为主编辑 这是有道理的。您不希望将数据库连接关闭到垃圾收集器。

答案 2 :(得分:3)

如果没有原始文章,我不能代表作者。但是,根据您实现实例化和打开与try / catch / finally块相关的连接的方式,您可能需要在调用close之前进行一些额外的检查。例如,确保连接不为空且尚未关闭。

编辑:文章说不要在Finalize方法中处理连接对象,而不是在finally块中关闭它。实际上,在上面的段落中,它表示在使用它之后应该始终关闭连接,因此它将返回到连接池。

“注意建议您在使用完毕后始终关闭Connection,以便将连接返回到池中。这可以使用Connection对象的Close或Dispose方法来完成。如果未达到最大池大小且已达到最大池大小连接仍然有效。

注意请勿在类的Finalize方法中对Connection,DataReader或任何其他托管对象调用Close或Dispose。在终结器中,仅释放您的类直接拥有的非托管资源。如果您的类不拥有任何非托管资源,请不要在类定义中包含Finalize方法。有关更多信息,“

http://msdn.microsoft.com/en-us/library/8xx3tyca(VS.71).aspx?ppud=4

答案 3 :(得分:2)

一点点Google搜索显示了几个包含opposite opinion的页面。使用“finally”块似乎是确保连接始终正确关闭的好方法,尽管正如其他人所说,我有兴趣看到原始文章说它不是一个好主意。

答案 4 :(得分:2)

从我在文章中看到它建议不要在类的 Finalizer 中调用Dispose或Close,而不是在 finally块中这样做,这是完全不同的事情。

答案 5 :(得分:0)

Close方法将连接对象置于可以重新打开它的状态。 Dispose方法将其置于无法重新打开的状态(如果当前打开则先关闭它)。

如果你实例化一个连接,打开它,使用它,然后扔掉它(正常的使用模式),然后using块是最好和最简单的方法。

显然,如果您正在使用多个OpenClose调用执行更复杂的操作,那么处理它将会使扳手投入使用。