在 .NET 应用程序中关闭 MySQL 连接是不是重要? (准确地说,C#)

Posted

技术标签:

【中文标题】在 .NET 应用程序中关闭 MySQL 连接是不是重要? (准确地说,C#)【英文标题】:Is closing a MySQL connection important in a .NET application ? (To be exact, C#)在 .NET 应用程序中关闭 MySQL 连接是否重要? (准确地说,C#) 【发布时间】:2015-07-01 21:36:51 【问题描述】:

人们在早期使用 mysql 时了解到的第一件事是,在使用后立即关闭连接很重要,但为什么这如此重要?好吧,如果我们在网站上执行此操作,它可以节省一些服务器资源(如 here 所述)但是为什么我们应该在 .NET 桌面应用程序上执行此操作?它是否与 Web 共享相同的问题应用?还是有其他的?

【问题讨论】:

【参考方案1】:

是的,我认为关闭你的连接而不是让它打开或让垃圾收集器最终处理它很重要。 为什么你应该这样做有几个原因,下面我将描述如何

的最佳方法

为什么:

因此,您已经打开了与数据库的连接,并沿着该管道来回发送了一些数据,现在有了您正在寻找的结果。理想情况下,此时您对数据执行其他操作,并获得应用程序的最终结果。

一旦你从数据库中获得了你不再需要的数据,它的作用就完成了,所以让连接保持打开状态只会占用内存并增加数据库和你的应用程序必须保持的连接数跟踪可能会让你更接近你的最大连接数限制。

“但是等等!我必须快速调用很多数据库 继任者!”

好的,没问题,打开连接运行您的呼叫,然后再次将其关闭。在“现代”应用程序中打开与数据库的连接不会花费您大量的计算能力/时间,而明确关闭连接只会有帮助(释放内存,减少当前连接的数量) .

这就是为什么,这是方法

如何:

因此,根据您连接到 MySQL 数据库的方式,您可能会使用 IDisposible 对象来帮助管理连接。以下是MSDN 在使用 IDisposable 时所说的话:

通常,当您使用 IDisposable 对象时,您应该声明并 在 using 语句中实例化它。 using 语句调用 以正确的方式处理对象上的方法,并且(当你使用它时 如前所示)它还会导致对象本身超出范围 一旦调用 Dispose。在 using 块中,对象是 只读,不能修改或重新分配。

这是我个人对这个问题的看法:

    使用using 块有助于保持代码更简洁(可读性) 使用usingblock 有助于保持代码清晰(内存方面),它会“自动”清理未使用的项目 usingblock 有助于防止意外使用以前的连接,因为它会在您完成连接后自动关闭连接。

简而言之,我认为正确关闭连接很重要,最好使用con.close() 类型语句方法结合using

正如 cmets 中所指出的,这也是一个与您类似的非常好的问题/答案:Why always close Database connection?

【讨论】:

using 语句的精彩描述 - 如果您要添加关闭连接的实际原因,这个答案将是完整的。 添加了更多信息 +1,很好的解释。也可以参考这里:***.com/questions/4111594/… 将其添加到答案中以供参考【参考方案2】:

如果你使用连接池,你不会通过调用con.Close来关闭物理连接,你只是告诉池这个连接可以使用。如果你在循环中调用数据库的东西,如果你不关闭它们,你会很快得到像“打开的连接太多”这样的异常。

检查一下:

for (int i = 0; i < 1000; i++)

    var con = new SqlConnection(Properties.Settings.Default.ConnectionString);
    con.Open();
    var cmd = new SqlCommand("Select 1", con);
    var rd = cmd.ExecuteReader();
    while (rd.Read())
        Console.WriteLine("0) 1", i, rd.GetInt32(0));

可能的例外之一:

超时。在获得一个 来自池的连接。这可能是因为所有汇集的 正在使用连接并且已达到最大池大小。

顺便说一句,MySqlConnection 也是如此。

这是正确的方法,对所有实现IDsiposable的类型使用using语句:

using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString))

    con.Open();
    for (int i = 0; i < 1000; i++)
    
        using(var cmd = new SqlCommand("Select 1", con))
        using (var rd = cmd.ExecuteReader())
            while (rd.Read())
                Console.WriteLine("0) 1", i, rd.GetInt32(0));
    
// no need to close it with the using statement, will be done in connection.Dispose

【讨论】:

+1 - 我认为连接池问题是未正确处理连接遇到的主要因素。 +1 用于描述using 语句 - 许多人忘记或未受过关于他们如何操作的知识。出于这个原因,我个人很喜欢它们,并且任何时候我有我的任何对象都可以实现为IDisposable,我这样做是为了方便。

以上是关于在 .NET 应用程序中关闭 MySQL 连接是不是重要? (准确地说,C#)的主要内容,如果未能解决你的问题,请参考以下文章

在浏览器中关闭 WebSocket 连接时是不是必须手动删除事件侦听器?

如何在 Rails 中关闭 MySQL 严格模式

在 Access 中是不是可以从全局函数中关闭变量?

在 Netty 中关闭客户端连接

如何在 IronPython 中关闭 WPF 窗口而不关闭 .NET 应用程序

我是不是需要在 Java 中关闭 IO 流? [复制]