类型:数据库类大小: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);});
经过一天的测试,没有问题。
结论:对于一些只有少数人使用的应用程序,数据库连接可能不会关闭,但在编写代码时最好加上连接是否打开的判断。