手机版

数据库连接必须关闭吗?也有关不了的!

时间:2021-08-05 来源:互联网 编辑:宝哥软件园 浏览:

类型:数据库类大小:5.9M语言:中文评分:10.0标签:立即下载。首先要注意的是,连接数是有限的:

代码如下:

for(inti=0;i10000I){ SqlConnectionconn=newSqlConnection(@ ' data source=。\ SQLEXPRESSAttachDbFilename=' e : \ DB \ NORTWND . MDF ';集成安全性=真;ConnectTimeout=30用户实例=真’);conn . Open();控制台。write line(“{ 0 }个连接已打开”,I);}运行结果如下:

过一会儿,系统会提示您打开连接超时:

可以看出数据库连接是有局限性的。如果连接没有关闭,用户很多,系统很快就会关闭。

但有时,由于某种原因,应用程序可能只被少数人使用,所以有人设计了它:

应用程序启动时打开数据库连接,应用程序关闭时关闭数据库连接

那么用这种方法有什么不好呢?

首先,假设有一个表Nums,定义如下:

主要代码如下:

SqlConnectionconn=newsql connection(@ ' data source=。\ SQLEXPRESSAttachDbFilename=' e : \ DB \ NORTWND . MDF ';集成安全性=真;ConnectTimeout=30用户实例=真’);conn . Open();平行。For(1,9999,(id)={ExecuteCommand(conn,id);});从1到9999执行命令

ExecuteCommand代码如下:

privatedstationvalexecute command(sqlconnectionconn,intid) {console。writeline('正在执行。id);线程。睡眠(100);SqlCommandcmd=newSqlCommand(字符串。格式(' insertintonumvalues(' { 0 } ')',id),conn);cmd。executionquery();}运行:

您可以看到ExecuteNonQuery方法抛出了一个异常,因为连接已关闭。

但是我们的连接一直是开放的,我们没有调用像close和dispose这样的方法。

然后在ExecuteCommand前添加判断条件:

如果(conn.State!=系统。data . connectionstate . Open)conn . Open();再次运行:

您可以看到连接已经关闭。你知道为什么吗?

这是多线程环境造成的。所以需要上锁。

privatedstationsyncobj=new object();privatedstationvoiceexecutecommand(SqlConnectionconn,intid){ lock(syncObj){ if(conn . State!=系统。data . connectionstate . Open)conn . Open();控制台。WriteLine('正在执行.'id);线程。睡眠(100);SqlCommandcmd=newSqlCommand(字符串。格式(' insertintonumvalues(' { 0 } ')',id),conn);cmd。executionquery();}}再次运行:可以发现基本没有问题。

修改平行最大值的上限。用于测试是否可以长时间执行。

平行。对于(1,Int32。MaxValue,(id)={ExecuteCommand(conn,id);});

经过一天的测试,没有问题。

结论:对于一些只有少数人使用的应用程序,数据库连接可能不会关闭,但在编写代码时最好加上连接是否打开的判断。

版权声明:数据库连接必须关闭吗?也有关不了的!是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。