说起连接池,我先举个例子吧,
String constr = "Data Source=.;Initial Catalog=Text;User Id=sa;Password=AAA123456";
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 3000; i++)
{
using (SqlConnection con = new SqlConnection(constr))
{
con.Open();
con.Close();
}
}
watch.Stop();
Console.WriteLine(watch.Elapsed); //用时:00:00:00.0996231
我们听过秒表计时可以看到,执行3000次的打开关闭数据库连接用时00:00:00.0996231
现在我禁用连接池:
String constr = "Data Source=.;Initial Catalog=Text;User Id=sa;Password=AAA123456;Pooling=false";(重复的代码这里就不写了)
用时:00:00:05.9983207
可以看到同样执行3000次的打开关闭连接操作,用时相差差不多60倍!
这个主要就是我们创建了ADO连接,在关闭的时候,连接被放到了一个叫做ADO连接池的东西里面了,在下次打开的时候直接从连接池打开就好(前提是两次连接字符串必须一致,包括空格),而关闭连接池的话,那么数据库的连接与关闭就真的这样一直开关开关的折腾了3000次。 不过连接池是默认启用的
其实在系统内部,在SqlConnection创建连接以后,真正连接数据库的是_innerConnection属性,所以说当连接Dispose以后,innerConnection属性被放到了连接池里,而con这个对象被销毁。创建的con对象只是对_innerConnection属性的一个封装,当下次再连接的时候如果连接字符串一样,虽然连接对象被销毁了,但是真正连接数据库的_innerConnection属性并没有销毁,所以说就不用再创建连接。我们在Sql数据库里面创建一个跟踪,可以看到启用连接池就打开了一次,连关闭都没有,而关闭连接池打开关闭连接池,跟踪里面login longout好多行,显然这就占用资源。
注意:1,连接池是在连接关闭的时候创建的
2,连接池一般是不禁用的,尤其在ASP.NET程序中,n多用户同时访问,并且大都访问采用的是同一个连接字符串。
3,如果一个程序有多个客户端,每个客户端采用的都是各自的连接字符串,这时我们就禁用连接池,免得在池里面保存多个打开的连接对象。