婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > .net 中的SqlConnection連接池機制詳解

.net 中的SqlConnection連接池機制詳解

熱門標簽:泰州手機外呼系統軟件 怎樣在地圖標注消火栓圖形 濟源人工智能電話機器人價格 百度地圖標注點擊事件 廈門四川外呼系統 杭州智能電話機器人 山東防封電銷卡辦理套餐 地圖標注位置多的錢 內蒙古智能電銷機器人哪家強

正確的理解這個連接池機制,有助于我們編寫高效的數據庫應用程序。

很多人認為 SqlConnection 的連接是不耗時的,理由是循環執行 SqlConnection.Open 得到的平均時間幾乎為0,但每次首次open 時,耗時又往往達到幾個毫秒到幾秒不等,這又是為什么呢?

首先我們看一下 MSDN 上的權威文檔上是怎么說的

Connecting to a database server typically consists of several time-consuming steps. A physical channel such as a socket or a named pipe must be established, the initial handshake with the server must occur, the connection string information must be parsed, the connection must be authenticated by the server, checks must be run for enlisting in the current transaction, and so on.

以上摘自 http://msdn.microsoft.com/en-us/library/8xx3tyca%28VS.80%29.aspx

也就是說物理連接建立時,需要做和服務器握手,解析連接字符串,授權,約束的檢查等等操作,而物理連接建立后,這些操作就不會去做了。這些操作是需要一定的時間的。所以很多人喜歡用一個靜態對象存儲 SqlConnection 來始終保持物理連接,但采用靜態對象時,多線程訪問會帶來一些問題,實際上,我們完全不需要這么做,因為 SqlConnection 默認打開了連接池功能,當程序 執行  SqlConnection.Close 后,物理連接并不會被立即釋放,所以這才出現當循環執行 Open操作時,執行時間幾乎為0.

下面我們先看一下不打開連接池時,循環執行 SqlConnection.Open 的耗時

復制代碼 代碼如下:

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

復制代碼 代碼如下:

.csharpcode { BACKGROUND-COLOR: #ffffff; FONT-FAMILY: consolas, "Courier New", courier, monospace; COLOR: black; FONT-SIZE: small }
.csharpcode PRE { BACKGROUND-COLOR: #ffffff; FONT-FAMILY: consolas, "Courier New", courier, monospace; COLOR: black; FONT-SIZE: small }
.csharpcode PRE { MARGIN: 0em }
.csharpcode .rem { COLOR: #008000 }
.csharpcode .kwrd { COLOR: #0000ff }
.csharpcode .str { COLOR: #006080 }
.csharpcode .op { COLOR: #0000c0 }
.csharpcode.preproc { COLOR: #cc6633 }
.csharpcode .asp { BACKGROUND-COLOR: #ffff00 }
.csharpcode .html { COLOR: #800000 }
.csharpcode .attr { COLOR: #ff0000 }
.csharpcode .alt { BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; WIDTH: 100% }
.csharpcode .lnum { COLOR: #606060 }

SqlConnection 默認是打開連接池的,如果要強制關閉,我們需要在連接字符串中加入 Pooling=False

調用程序如下:

復制代碼 代碼如下:

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

下面是測試結果

復制代碼 代碼如下:

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的值就可以保持若干物理連接始終不釋放了。看代碼

復制代碼 代碼如下:

       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

 

IIS 回收應用程序池對連接池的影響
在做 ASP.NET 程序時,我們會發現,如果網站20分鐘不訪問,再次訪問就會比較慢,這是因為IIS默認的 idle timeout 是20分鐘,如果在20分鐘內沒有一個訪問,IIS 將回收應用程序池,回收應用程序池的結果就相當于應用程序被重啟,所有原來的全局變量,session, 物理連接都將清空。回收應用程序池后首次訪問,相當于前面我們看到的程序啟動后第一次訪問數據庫,連接的建立時間將比較長。所以如果網站在某些時段訪問量很少的話,需要考慮 idle timeout 是否設置合理。

標簽:周口 喀什 洛陽 朔州 新鄉 臺州 朝陽 百色

巨人網絡通訊聲明:本文標題《.net 中的SqlConnection連接池機制詳解》,本文關鍵詞  .net,中的,SqlConnection,連接,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《.net 中的SqlConnection連接池機制詳解》相關的同類信息!
  • 本頁收集關于.net 中的SqlConnection連接池機制詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    蜜臀久久久99精品久久久久久| 免费看黄色91| 国产精品免费免费| 国产精品久久久久影院老司| 九一久久久久久| 波多野洁衣一区| 国产天堂亚洲国产碰碰| 成人午夜免费电影| 精品美女一区二区三区| 日韩av在线免费观看不卡| 欧美日韩精品一区视频| 亚洲综合图片区| 精品国产一区二区三区不卡| 国产一区二区三区免费看| 久久久.com| 99久久精品99国产精品| 久久久欧美精品sm网站 | 3atv一区二区三区| 青椒成人免费视频| 亚洲欧洲av一区二区三区久久| 黄网站免费久久| 中文字幕一区二区不卡| 色吊一区二区三区| 香港成人在线视频| 欧美国产精品中文字幕| 国产在线不卡一区| 国产精品少妇自拍| 欧美性受xxxx| 国产盗摄精品一区二区三区在线| 亚洲欧美偷拍另类a∨色屁股| 欧美日韩电影在线播放| 精品一区二区三区不卡| 国产精品乱码一区二区三区软件| 欧美理论电影在线| 日韩va欧美va亚洲va久久| 久久影院午夜片一区| 精品视频免费在线| 国产a久久麻豆| 日本成人中文字幕在线视频| 亚洲一区二区三区视频在线播放| 亚洲国产成人私人影院tom| 欧美视频在线观看一区二区| 日韩精品一二区| 亚洲国产精品99久久久久久久久 | 91精品国产黑色紧身裤美女| 成人av网址在线| 大胆欧美人体老妇| 成人精品鲁一区一区二区| 亚洲超碰精品一区二区| 亚洲欧美日韩一区二区 | 欧美人狂配大交3d怪物一区| 国产精品资源站在线| 三级久久三级久久| 亚洲成a人v欧美综合天堂下载| 亚洲欧美激情视频在线观看一区二区三区| 日韩欧美另类在线| 欧美综合一区二区三区| 国产不卡高清在线观看视频| 紧缚捆绑精品一区二区| 亚洲曰韩产成在线| 亚洲精品乱码久久久久久黑人| 国产精品视频免费看| 日韩一区在线免费观看| 亚洲国产欧美另类丝袜| 亚洲主播在线观看| 日本伊人精品一区二区三区观看方式 | 一本大道av伊人久久综合| 日韩国产精品久久久| 国产一区二区精品久久| 捆绑调教美女网站视频一区| 午夜精品福利一区二区蜜股av| 国产欧美综合在线| 17c精品麻豆一区二区免费| 亚洲成a人片综合在线| 亚洲国产视频网站| 精品一区二区三区影院在线午夜| 国内成人免费视频| 国产一区二区三区在线观看精品| 国产999精品久久| 欧美巨大另类极品videosbest| 91精品久久久久久久久99蜜臂| 日韩欧美一区二区免费| 久久一区二区视频| 亚洲丝袜制服诱惑| 亚洲一区二区三区在线| 麻豆精品视频在线观看视频| 国产高清无密码一区二区三区| av在线一区二区三区| 欧美精品v日韩精品v韩国精品v| 日韩一区二区精品葵司在线| 色哟哟国产精品免费观看| 欧美一区二区在线看| 久久久久国产精品麻豆| 国产精品麻豆99久久久久久| 免费黄网站欧美| 欧美色综合久久| 欧美一区二区视频网站| 国产蜜臀av在线一区二区三区| 日韩电影在线一区| 黄色资源网久久资源365| 高清国产一区二区| 久久久久久久国产精品影院| 日韩成人精品在线观看| 欧美天堂一区二区三区| 亚洲精品欧美综合四区| 欧美一区二区三区婷婷月色| 亚洲电影在线播放| 在线电影国产精品| 美日韩一级片在线观看| 国产人久久人人人人爽| 成人免费毛片aaaaa**| 久久精品无码一区二区三区| 丁香激情综合国产| 亚洲图片一区二区| 欧美精品在线一区二区三区| 国产麻豆欧美日韩一区| 国产精品视频观看| 日本韩国一区二区三区| 亚洲成人先锋电影| 久久精品一区二区三区不卡| 色狠狠桃花综合| 免费成人av在线| 欧美亚洲动漫精品| 老司机精品视频导航| 成人国产精品视频| 亚洲综合视频在线观看| 国产一区在线精品| 日韩一区二区三区在线| 亚洲视频一区二区免费在线观看| 91精品国产综合久久久久久久| 日韩一区二区电影在线| 亚洲午夜久久久久中文字幕久| 国产麻豆成人精品| 9191久久久久久久久久久| 91精品国产欧美一区二区成人| 亚洲第一电影网| 五月天一区二区| 国模少妇一区二区三区| 成人精品国产福利| 欧美在线不卡视频| 国产精品视频看| 成人av动漫网站| 中文字幕在线播放不卡一区| 极品少妇一区二区三区精品视频| 日韩精品1区2区3区| 91啪亚洲精品| 精品亚洲国产成人av制服丝袜| 国产精品天天摸av网| 天天操天天色综合| 欧美日韩国产一二三| 久久激情五月婷婷| 欧美日韩大陆一区二区| 日韩激情中文字幕| 久久日韩精品一区二区五区| 国产麻豆欧美日韩一区| 国产91在线看| 成人av午夜电影| 欧美美女喷水视频| 日本va欧美va精品发布| 国产精品久久久久久亚洲毛片 | 亚洲一区二区精品视频| 国产精品久久久久久久久免费樱桃 | 久久久久久亚洲综合| 亚洲欧洲成人精品av97| 精品免费日韩av| 日本韩国精品在线| 国产老女人精品毛片久久| 欧美曰成人黄网| 丁香六月综合激情| 国产精品护士白丝一区av| 国产婷婷色一区二区三区在线| 极品美女销魂一区二区三区免费 | 日日骚欧美日韩| 一区二区三区在线视频免费| 欧美久久婷婷综合色| 亚洲成人激情av| 2023国产精品| 国产成人av自拍| 老司机午夜精品99久久| 国产精品国产三级国产专播品爱网| 欧美日韩一卡二卡| 欧美国产丝袜视频| 欧美精品国产精品| 26uuu国产在线精品一区二区| av资源网一区| 国产在线精品一区在线观看麻豆| 日本一区二区三区高清不卡 | 亚洲精品国久久99热| 久久久久久久久久久99999| 欧美在线小视频| 久久嫩草精品久久久精品一| 欧美视频中文字幕| 欧美日韩高清不卡| 国产高清久久久| 日本成人在线不卡视频| 亚洲人成人一区二区在线观看| 欧美日韩高清影院| 在线亚洲免费视频| 91视频91自| 另类的小说在线视频另类成人小视频在线|