数据库连接一定要关闭吗?也有可以不关闭的!

数据库连接一定要关闭吗?也有可以不关闭的!,第1张

但是有时候由于某些原因应用程序可能只是几个人使用,所以就有人设计了:在应用程序启动的时候打开数据库连接,在应用程序关闭的时候关闭数据库连接那么使用这种方式有什么问题呢?首先假设有一张表Nums,表定义如下:Main代码如下:SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESSAttachDbFilename=""E:\DB\NORTHWND.mdf""Integrated Security=TrueConnect Timeout=30User Instance=True")conn.Open()Parallel.For(1, 9999, (id) =>{ ExecuteCommand(conn, id)})就是从1到9999开始执行ExecuteCommand ExecuteCommand代码如下:privatestaticvoid ExecuteCommand(SqlConnection conn, int id) { Console.WriteLine("正在执行." + id)Thread.Sleep(100)SqlCommand cmd = new SqlCommand( string.Format("Insert into Nums values('{0}') ", id), conn)cmd.ExecuteNonQuery()}运行:可以看到ExecuteNonQuery方法抛出了异常,原因是连接处于关闭状态。 可是我们的连接一直都是open着的啊,并没有调用close,dispose之类的方法啊。于是在ExecuteCommand前面增加判断条件:if (conn.State != System.Data.ConnectionState.Open) conn.Open()再次运行:可以看到还是会出现连接已关闭的问题。你知道什么原因吗? 这里是由于多线程环境引起的。所以需要加锁。privatestaticobject syncObj = newobject()privatestaticvoid ExecuteCommand(SqlConnection conn, int id) { lock (syncObj) { if (conn.State != System.Data.ConnectionState.Open) conn.Open()Console.WriteLine("正在执行.." + id)Thread.Sleep(100)SqlCommand cmd = new SqlCommand( string.Format("Insert into Nums values('{0}') ", id), conn)cmd.ExecuteNonQuery()} } 再次运行:可以发现基本没问题了.修改Parallel.For的最大值上限,要测试下是否可以长期执行了。Parallel.For(1, Int32.MaxValue, (id) =>{ ExecuteCommand(conn, id)})一天测试下来,没出现任何问题。结论:对于某些只有几个人使用的应用程序,可以不关闭数据库连接,但是在写代码的时候最好要加上连接是否打开的判断。

mysql的最大连接数是有限制的,如果你一直连接从不关闭,这样导致你后续将因为连接数过多而无法连接。

还有一点就是如果你的数据库含有大量无用连接没有释放的话,会占用数据库很多资源,导致数据库响应变慢,浪费资源。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9963473.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存