为什么要关闭数据库连接,可以不关闭吗?
2011-08-12 13:41
211 查看
首先要说明的是连接数是有限制的:
代码如下:
.csharpcode,.csharpcodepre
{font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}.csharpcodepre{margin:0em;}.csharpcode.rem{color:#008000;}.csharpcode.kwrd{color:#0000ff;}.csharpcode.str{color:#006080;}.csharpcode.op{color:#0000c0;}.csharpcode.preproc{color:#cc6633;}.csharpcode.asp{background-color:#ffff00;}.csharpcode.html{color:#800000;}.csharpcode.attr{color:#ff0000;}.csharpcode.alt
{background-color:#f4f4f4;
width:100%;
margin:0em;
}.csharpcode.lnum{color:#606060;}
运行结果如下:
过一会就会提示打开连接超时了:
可以看到数据库连接时有限制的,如果连接不关闭,而且使用的人比较多,那么系统很快就down掉了。
但是有时候由于某些原因应用程序可能只是几个人使用,所以就有人设计了:
在应用程序启动的时候打开数据库连接,在应用程序关闭的时候关闭数据库连接
那么使用这种方式有什么问题呢?
首先假设有一张表Nums,表定义如下:
Main代码如下:
就是从1到9999开始执行ExecuteCommand
.csharpcode,.csharpcodepre
{font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}.csharpcodepre{margin:0em;}.csharpcode.rem{color:#008000;}.csharpcode.kwrd{color:#0000ff;}.csharpcode.str{color:#006080;}.csharpcode.op{color:#0000c0;}.csharpcode.preproc{color:#cc6633;}.csharpcode.asp{background-color:#ffff00;}.csharpcode.html{color:#800000;}.csharpcode.attr{color:#ff0000;}.csharpcode.alt
{background-color:#f4f4f4;
width:100%;
margin:0em;
}.csharpcode.lnum{color:#606060;}
ExecuteCommand代码如下:
.csharpcode,.csharpcodepre
{font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}.csharpcodepre{margin:0em;}.csharpcode.rem{color:#008000;}.csharpcode.kwrd{color:#0000ff;}.csharpcode.str{color:#006080;}.csharpcode.op{color:#0000c0;}.csharpcode.preproc{color:#cc6633;}.csharpcode.asp{background-color:#ffff00;}.csharpcode.html{color:#800000;}.csharpcode.attr{color:#ff0000;}.csharpcode.alt
{background-color:#f4f4f4;
width:100%;
margin:0em;
}.csharpcode.lnum{color:#606060;}
运行:
可以看到ExecuteNonQuery方法抛出了异常,原因是连接处于关闭状态。
可是我们的连接一直都是open着的啊,并没有调用close,dispose之类的方法啊。
于是在ExecuteCommand前面增加判断条件:
.csharpcode,.csharpcodepre
{font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}.csharpcodepre{margin:0em;}.csharpcode.rem{color:#008000;}.csharpcode.kwrd{color:#0000ff;}.csharpcode.str{color:#006080;}.csharpcode.op{color:#0000c0;}.csharpcode.preproc{color:#cc6633;}.csharpcode.asp{background-color:#ffff00;}.csharpcode.html{color:#800000;}.csharpcode.attr{color:#ff0000;}.csharpcode.alt
{background-color:#f4f4f4;
width:100%;
margin:0em;
}.csharpcode.lnum{color:#606060;}
再次运行:
可以看到还是会出现连接已关闭的问题。你知道什么原因吗?
这里是由于多线程环境引起的。所以需要加锁。
再次运行:可以发现基本没问题了.
修改Parallel.For的最大值上限,要测试下是否可以长期执行了。
一天测试下来,没出现任何问题。
结论:对于某些只有几个人使用的应用程序,可以不关闭数据库连接,但是在写代码的时候最好要加上连接是否打开的判断。
from:/article/4793788.html
代码如下:
for(inti=0;i<10000;i++) { SqlConnectionconn=newSqlConnection(@"DataSource=.\SQLEXPRESS; AttachDbFilename=""E:\DB\NORTHWND.mdf""; IntegratedSecurity=True;ConnectTimeout=30;UserInstance=True"); conn.Open(); Console.WriteLine("打开了{0}个连接",i); }
.csharpcode,.csharpcodepre
{font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}.csharpcodepre{margin:0em;}.csharpcode.rem{color:#008000;}.csharpcode.kwrd{color:#0000ff;}.csharpcode.str{color:#006080;}.csharpcode.op{color:#0000c0;}.csharpcode.preproc{color:#cc6633;}.csharpcode.asp{background-color:#ffff00;}.csharpcode.html{color:#800000;}.csharpcode.attr{color:#ff0000;}.csharpcode.alt
{background-color:#f4f4f4;
width:100%;
margin:0em;
}.csharpcode.lnum{color:#606060;}
运行结果如下:
过一会就会提示打开连接超时了:
可以看到数据库连接时有限制的,如果连接不关闭,而且使用的人比较多,那么系统很快就down掉了。
但是有时候由于某些原因应用程序可能只是几个人使用,所以就有人设计了:
在应用程序启动的时候打开数据库连接,在应用程序关闭的时候关闭数据库连接
那么使用这种方式有什么问题呢?
首先假设有一张表Nums,表定义如下:
Main代码如下:
SqlConnectionconn=newSqlConnection(@"DataSource=.\SQLEXPRESS; AttachDbFilename=""E:\DB\NORTHWND.mdf""; IntegratedSecurity=True;ConnectTimeout=30;UserInstance=True"); conn.Open(); Parallel.For(1,9999,(id)=> { ExecuteCommand(conn,id); });
就是从1到9999开始执行ExecuteCommand
.csharpcode,.csharpcodepre
{font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}.csharpcodepre{margin:0em;}.csharpcode.rem{color:#008000;}.csharpcode.kwrd{color:#0000ff;}.csharpcode.str{color:#006080;}.csharpcode.op{color:#0000c0;}.csharpcode.preproc{color:#cc6633;}.csharpcode.asp{background-color:#ffff00;}.csharpcode.html{color:#800000;}.csharpcode.attr{color:#ff0000;}.csharpcode.alt
{background-color:#f4f4f4;
width:100%;
margin:0em;
}.csharpcode.lnum{color:#606060;}
ExecuteCommand代码如下:
privatestaticvoidExecuteCommand(SqlConnectionconn,intid)
{Console.WriteLine("正在执行."+id);
Thread.Sleep(100);
SqlCommandcmd=newSqlCommand(
string.Format("InsertintoNumsvalues('{0}')",id),conn);
cmd.ExecuteNonQuery();
}
.csharpcode,.csharpcodepre
{font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}.csharpcodepre{margin:0em;}.csharpcode.rem{color:#008000;}.csharpcode.kwrd{color:#0000ff;}.csharpcode.str{color:#006080;}.csharpcode.op{color:#0000c0;}.csharpcode.preproc{color:#cc6633;}.csharpcode.asp{background-color:#ffff00;}.csharpcode.html{color:#800000;}.csharpcode.attr{color:#ff0000;}.csharpcode.alt
{background-color:#f4f4f4;
width:100%;
margin:0em;
}.csharpcode.lnum{color:#606060;}
运行:
可以看到ExecuteNonQuery方法抛出了异常,原因是连接处于关闭状态。
可是我们的连接一直都是open着的啊,并没有调用close,dispose之类的方法啊。
于是在ExecuteCommand前面增加判断条件:
if(conn.State!=System.Data.ConnectionState.Open)
conn.Open();
.csharpcode,.csharpcodepre
{font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}.csharpcodepre{margin:0em;}.csharpcode.rem{color:#008000;}.csharpcode.kwrd{color:#0000ff;}.csharpcode.str{color:#006080;}.csharpcode.op{color:#0000c0;}.csharpcode.preproc{color:#cc6633;}.csharpcode.asp{background-color:#ffff00;}.csharpcode.html{color:#800000;}.csharpcode.attr{color:#ff0000;}.csharpcode.alt
{background-color:#f4f4f4;
width:100%;
margin:0em;
}.csharpcode.lnum{color:#606060;}
再次运行:
可以看到还是会出现连接已关闭的问题。你知道什么原因吗?
这里是由于多线程环境引起的。所以需要加锁。
privatestaticobjectsyncObj=newobject();
privatestaticvoidExecuteCommand(SqlConnectionconn,intid)
{
lock(syncObj)
{
if(conn.State!=System.Data.ConnectionState.Open)
conn.Open();
Console.WriteLine("正在执行.."+id);
Thread.Sleep(100);
SqlCommandcmd=newSqlCommand(
string.Format("InsertintoNumsvalues('{0}')",id),conn);
cmd.ExecuteNonQuery();
}
}
再次运行:可以发现基本没问题了.
修改Parallel.For的最大值上限,要测试下是否可以长期执行了。
Parallel.For(1,Int32.MaxValue,(id)=>
{
ExecuteCommand(conn,id);
});
一天测试下来,没出现任何问题。
结论:对于某些只有几个人使用的应用程序,可以不关闭数据库连接,但是在写代码的时候最好要加上连接是否打开的判断。
from:
相关文章推荐
- 为什么要关闭数据库连接,可以不关闭吗?
- 关于数据库连接数问题(为什么要关闭数据库连接,可以不关闭吗?)
- 为什么要关闭数据库连接,可以不关闭吗?
- 为什么要关闭数据库连接,可以不关闭吗?
- 为什么要关闭数据库连接,可以不关闭吗?
- 为什么要关闭数据库连接,可以不关闭吗?
- 为什么要关闭数据库连接,可以不关闭吗? [转]
- 为什么要关闭数据库连接,可以不关闭吗?
- 为什么数据库可以连接但是载入表速度很慢(原创)
- BGP为什么全网状连接下就可以关闭同步
- 为什么数据库可以连接上,却写不进数据库东西啊
- mysql修改可以远程连接和关闭远程连接
- 为什么多个客户端可以连接服务器的同个端口?
- 当别人连着你的ssh,提掉他,然后关闭sshd,别人就不可以连接了
- 客户端一段时间不访问,第一次访问数据库自动断开连接,刷新可以正常连接
- 偷来的(一个连接数据库完整程序可以作为模板(从csdn中获得) )
- 为什么 muduo 的 shutdown() 没有直接关闭 TCP 连接?
- 关闭数据库连接的存储过程
- sqlserver 数据库的分发mail程序是否可以和LOTUS 邮件系统连接
- C#提升性能"数据库连接打开与关闭"经验分享(附:优化过的DBHelper类) 之配餐系统的开发