人们在早期使用MySQL时所学到的一些事情,即在使用后立即关闭连接很重要,但为什么这么重要?好吧,如果我们在网站上这样做,它可以节省一些服务器资源(如here所述)但为什么我们应该在.NET桌面应用程序上执行此操作?它是否共享相同的问题与Web应用程序?或者还有其他人吗?
答案 0 :(得分:6)
如果您使用连接池,则无法通过调用con.Close
来关闭物理连接,您只需告诉池可以使用此连接。如果你在一个循环中调用数据库的东西,你会得到像#34这样的例外;过多的开放连接"如果你不关闭它们,请很快。
检查一下:
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));
}
可能的例外情况之一:
超时已过期。在获得a之前经过了超时时间 从游泳池连接。这可能是因为所有人都集中了 正在使用连接并达到最大池大小。
顺便说一句,MySqlConnection
也是如此。
这是正确的方法,对实现using
的所有类型使用IDsiposable
语句:
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 :(得分:3)
是的我认为关闭连接而不是让它保持打开或允许垃圾收集器最终处理它是很重要的。有几个原因为什么你应该这样做以及下面我将描述如何的最佳方法
<强>为什么:强>
因此,您已打开与数据库的连接,并沿此管道来回发送一些数据,现在可以获得您正在寻找的结果。理想情况下,此时您可以使用数据执行其他操作,并实现应用程序的最终结果。
从数据库中获取数据后,您再也不需要它了,它的部分内容已完成,因此保持连接打开只会占用内存并增加数据库和应用程序的连接数跟踪和可能会使您更接近最大连接数限制。
&#34;但是等等!我必须快速进行大量的数据库调用 !演替&#34;
好的没问题,打开连接运行你的电话,然后再将其关闭。在&#34;现代&#34;中打开与数据库的连接。应用程序不会花费你大量的计算能力/时间,而明确关闭连接只会帮助(释放内存,降低当前连接数)。
这就是为什么,这里是如何
如何强>
因此,根据您连接MySQL数据库的方式,您可能使用IDisposible对象来帮助管理连接。以下是MSDN在使用IDisposable时所说的内容:
通常,当您使用IDisposable对象时,您应该声明和 在using语句中实例化它。 using语句调用 以正确的方式处理对象上的方法,以及(当您使用它时) 如前所示)它也会导致对象本身超出范围 只要调用Dispose。在使用块中,对象是 只读,无法修改或重新分配。
以下是我个人对此主题的看法:
using
块有助于保持代码清洁(可读性)using
块有助于保持代码清晰(以内存方式),它将自动生成&#34;清理未使用的物品using
块有助于防止意外使用以前的连接,因为它会在您完成连接时自动关闭连接。简而言之,我认为正确关闭连接很重要,最好使用con.close()
类型语句方法结合using
块
正如评论中所指出的,这也是一个非常好的问题/答案,类似于你的:Why always close Database connection?