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


Without Pooling, first connection elapsed 13 ms
Without Pooling, average connection elapsed 5 ms
Wating for 10s
Without Pooling, first connection elapsed 6 ms
Without Pooling, average connection elapsed 4 ms
Wating for 600s
Without Pooling, first connection elapsed 7 ms
Without Pooling, average connection elapsed 4 ms


从这个测试结果看,关闭连接池后,平均每次连接大概要耗时4个毫秒左右,这个就是建立物理连接的平均耗时。

下面再看默认情况下的测试代码

复制代码 代码如下:


        public static void OpenWithPooling() 
 {        
 string connectionString =  "Data Source=192.168.10.2; Initial Catalog=News; Integrated Security=True;";
 Stopwatch sw = new Stopwatch();   
 sw.Start();       
 using (SqlConnection conn =  new SqlConnection(connectionString))    
 {             
 conn.Open();   
 }        
 sw.Stop();      
 Console.WriteLine("With Pooling, first connection elapsed {0} ms", 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, average connection elapsed {0} ms", sw.ElapsedMilliseconds / 100); 
 }

调用代码

复制代码 代码如下:


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

测试结果

With Pooling, first connection elapsed 119 ms
With Pooling, average connection elapsed 0 ms
Waiting for 10s
With Pooling, first connection elapsed 0 ms
With Pooling, average connection elapsed 0 ms
Waiting for 600s
With Pooling, first connection elapsed 6 ms
With Pooling, average connection elapsed 0 ms


这个测试结果看,第一次耗时是119ms,这是因为我在测试代码中,首先运行的是这个测试过程,119 ms 是程序第一次启动时的首次连接耗时,这个耗时可能不光包括连接数据库的时间,还有 ado.net 自己初始化的用时,所以这个用时可以不管。10秒以后在执行这个测试过程,首次执行的时间变成了0ms,这说明连接池机制发生了作用,SqlConnection Close 后,物理连接并没有被关闭,所以10秒后再执行,连接几乎没有用时间。

但我们发现一个有趣的现象,10分钟后,首次连接时间变成了6ms,这个和前面不打开连接池的测试用时几乎一样,也就是说10分钟后,物理连接被关闭了,又重新打开了一个物理连接。这个现象是因为连接池有个超时时间,默认情况下应该在5-10分钟之间,如果在此期间没有任何的连接操作,物理连接就会被关闭。那么我们有没有办法始终保持物理连接呢?方法是有的。

连接池设置中有一个最小连接池大小,默认为0,我们把它设置为大于0的值就可以保持若干物理连接始终不释放了。看代码

复制代码 代码如下:

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

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