2009-06-26 87 views
4

主要编辑: 我误读了文章!该评论是关于该类的finalize方法,而不是finally块:)。道歉。为什么不关闭数据库连接在最后的块

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

Here is the article

+1

您可以链接回原来的文章 – 2009-06-26 15:25:02

+0

我想你应该把文章的链接,如果是在线 – 2009-06-26 15:25:22

回答

13

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

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对象在需要时立即处理,而不是等待垃圾收集器处理它。

4

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

让一个未处理的(甚至是处理该事件)异常保留打开的连接,如果它有很多活动,可以非常快速地关闭数据库。

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

编辑到主编辑: 现在有道理。你不想离开你的数据库连接直到垃圾收集器。

3

没有原来的文章,我不能为作者说话。然而,根据你如何实现实例化和打开与你的try/catch/finally块有关的连接,你可能需要在调用close之前做一些额外的检查。例如,确保连接不为空并且尚未关闭。

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

“小心建议您在完成使用后始终关闭连接,以便将连接返回到池中。可以使用Connection对象的Close或Dispose方法来完成此操作。没有显式关闭的连接可能不会被添加或返回到池中,例如,超出范围但未显式关闭的连接只会在达到最大池大小时才会返回到连接池,并且连接仍然有效

注意不要在类的Finalize方法中的Connection,DataReader或任何其他托管对象上调用Close或Dispose。在终结器中,只能释放类所拥有的非托管资源。 如果你的类不拥有任何非托管资源,不要在类定义中包含Finalize方法。有关详细信息,“

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

2

谷歌搜索一点点变成了持有的oppositeopinion相当几页。使用‘最后’块似乎是一个很好的方式,以确保连接始终关闭虽然正如其他人所说,我会有兴趣看到原来的文章,说这不是一个好主意。

2

从我可以看到在文章中它建议反对调用处置或关闭在终结器一个类,而不是在最后一块阻止,这是完全不同的事情。

0

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

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

很明显,如果你正在做一些更复杂的事情,需要调用多个OpenClose,那么处置它会抛出一个扳手。

相关问题