判断WebBrowser浏览器网页加载完成的处理方法(2)


                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的值就可以保持若干物理连接始终不释放了。看代码

复制代码 代码如下:


        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,物理连接没有被关闭。

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

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