【问题标题】:Why Not Close a Database Connection in a Finally Block为什么不在 finally 块中关闭数据库连接
【发布时间】:2009-06-26 15:22:12
【问题描述】:

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

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

Here is the article

【问题讨论】:

  • 能否链接回原文
  • 我觉得你应该把文章的链接放在网上
  • 听起来像是一篇假文章...
  • 也许文章(需要那个链接!)使用 using 语句而不是 try-finally?但仍会表明文章作者不理解 using 语句的作用。
  • 你不想把 close 放在你的终结器中,因为你不知道它什么时候会被触发。最后肯定可以放上来看看这篇MSDN文章。 msdn.microsoft.com/en-us/library/system.object.finalize.aspx

标签: c# .net sql-server database


【解决方案1】:

如果您环顾四周,在 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 对象在需要后立即被释放,而不是等待垃圾收集器释放它。

【讨论】:

  • ... 而 using 语句只是 try-finally 的语法快捷方式。
  • 这不仅仅是一个捷径。 try-finally 块不会在 try-finally 块之后处理对象,直到垃圾收集器发挥其魔力。 using 语句将立即 Dispose 块完成。
  • 这将 SqlConnection 连接;尝试 { 连接 = 新 SqlConnection(connectionString);连接.打开(); } 最后 { connection.Dispose(); }
【解决方案2】:

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

如果数据库有很多活动,让未处理(或什至已处理)的异常保持打开的连接可以很快关闭数据库。

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

编辑到主要编辑: 现在这是有道理的。您不想让垃圾收集器关闭数据库连接。

【讨论】:

    【解决方案3】:

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

    编辑:文章说不要在 Finalize 方法中处理连接对象,不要在 finally 块中关闭它。事实上,在上面的段落中它说你应该在使用它之后关闭你的连接,所以它会被返回到连接池中。

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

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

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

    【讨论】:

      【解决方案4】:

      一点点谷歌搜索会出现相当多的页面,其中包含oppositeopinion。使用“finally”块似乎是确保连接始终正确关闭的好方法,尽管正如其他人所说,我很想看看原始文章说这不是一个好主意。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          显然,如果您通过多个 OpenClose 调用来执行更复杂的操作,那么处理它会导致工作中的问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-05
            • 2011-12-29
            • 1970-01-01
            • 2013-12-04
            • 1970-01-01
            • 2014-09-14
            • 2018-12-28
            • 1970-01-01
            相关资源
            最近更新 更多