代码改变世界

个人对ADO连接池的理解

  说起连接池,我先举个例子吧,

  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,如果一个程序有多个客户端,每个客户端采用的都是各自的连接字符串,这时我们就禁用连接池,免得在池里面保存多个打开的连接对象。

posted @ 2013-09-28 12:07  风一样的平凡  阅读(397)  评论(0编辑  收藏  举报