.net 中的SqlConnection连接池机制详解(3)


       public static void OpenWithPooling(int minPoolSize)
       {        
       string connectionString = string.Format("Data Source=192.168.10.2; Initial Catalog=News; Integrated Security=True;Min Pool Size={0}",minPoolSize); 
       Stopwatch sw = new Stopwatch();      
       sw.Start();     
       using (SqlConnection conn =   new SqlConnection(connectionString)) 
       {              
       conn.Open();    
       }       
       sw.Stop();   
       Console.WriteLine("With Pooling Min Pool Size={0}, first connection elapsed {1} ms",minPoolSize, sw.ElapsedMilliseconds);
       sw.Reset();         
       sw.Start();      
       for (int i = 0; i < 100; i++)   
       {               
       using (SqlConnection conn = new SqlConnection(connectionString))   
       {                  
 conn.Open();       
 }    
 }      
 sw.Stop();    
 Console.WriteLine("With Pooling Min Pool Size={0}, average connection elapsed {1} ms",minPoolSize, sw.ElapsedMilliseconds / 100); 
 }


其实只要在连接字符串中加入一个 Min Pool Size=n 就可以了。

调用代码

复制代码 代码如下:


               Test.SqlConnectionTest.OpenWithPooling(1);    
        Console.WriteLine("Waiting for 10s");     
        System.Threading.Thread.Sleep(10 * 1000); 
        Test.SqlConnectionTest.OpenWithPooling(1);       
        Console.WriteLine("Waiting for 600s");            
        System.Threading.Thread.Sleep(600 * 1000);     
        Test.SqlConnectionTest.OpenWithPooling(1);


With Pooling Min Pool Size=1, first connection elapsed 5 ms
With Pooling Min Pool Size=1, average connection elapsed 0 ms
Waiting for 10s
With Pooling Min Pool Size=1, first connection elapsed 0 ms
With Pooling Min Pool Size=1, average connection elapsed 0 ms
Waiting for 600s
With Pooling Min Pool Size=1, first connection elapsed 0 ms
With Pooling Min Pool Size=1, average connection elapsed 0 ms


我们可以看到当 Min Pool Size = 1  时,除了首次连接用时5ms以外,即便过了10分钟,用时还是0ms,物理连接没有被关闭。

多线程调用问题
多线程调用我也做了测试,这里不贴代码了,我大概讲一下结果。如果是多线程访问 SqlConnection ,注意是通过 new SqlConnection 方式访问,

那么这里有两个问题,如果后一个线程在前一个线程 Close 前调用了Open操作,那么 Ado.net 不可能复用一个物理连接,它将为第二个线程分配一个新的物理连接。如果后一个线程 Open  时,前一个线程已经 Close 了,则新的线程使用前一个线程的物理连接。也就是说,如果同时有n个线程连接数据库,最多情况下会创建n条物理连接,最少情况下为1条。如果创建n条物理连接,则用时理论上等于 n * t / cpu , n 为线程数,t 为每次创建物理连接的用时,前面测试的结果大概是5-10ms左右,cpu 为当前机器的CPU数量。另外网络,服务器的负荷也影响这个用时。为了保证在大并发时,尽量少的创建新的物理连接,我们可以适当把 Min Pool Size 调大一些,但也不要太大,因为单个机器TCP链路的数量是有限的,详见我另外一篇文章 Windows 下单机最大TCP连接数

连接字符串中关于 连接池方面的参数

见下面链接 SqlConnection.ConnectionString Property

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjgsff.html