欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Ado.net的連接池

系統 1741 0

本篇文章起源于在GCR MVP Open Day的時候和C# MVP張響討論連接池的概念而來的。因此單獨寫一篇文章剖析一下連接池。

為什么需要連接池

剖析一個技術第一個要問的是,這項技術為什么存在。

對于每一個到SQL Server的連接,都需要經歷TCP/IP協議的三次握手,身份認證,在SQL Server里建立連接,分配資源等。而當客戶端關閉連接時,客戶端就會和SQL Server終止物理連接。但是,我們做過數據庫開發的人都知道,每次操作完后關閉連接是再正常不過的事了,一個應用程序即使在負載不大的情況下也需要不停的連接SQL Server和關閉連接,同一個應用程序同時也可能存在多個連接。

因此,如果不斷的這樣建立和關閉連接,會是非常浪費資源的做法。因此Ado.net中存在連接池這種機制。在對SQL Server來說的客戶端的應用程序進程中維護連接池。統一管理Ado.net和SQL Server的連接,既連接池保持和SQL Server的連接,當Connection.Open()時,僅僅從連接池中分配一個已經和SQL Server建立的連接,當Connection.Close()時,也并不是和SQL Server物理斷開連接,僅僅是將連接進行回收。

因此,連接池總是能維護一定數量的和SQL Server的連接,以便應用程序反復使用這些連接以減少性能損耗。

重置連接的sys.sp_reset_connection

連接是有上下文的,比如說當前連接有未提交的事務,存在可用的游標,存在對應的臨時表。因此為了便于連接重復使用,使得下一個連接不會收到上一個連接的影響,SQL Server通過sys.sp_reset_connection來清除當前連接的上下文,以便另一個連接繼續使用。

當在Ado.net中調用了Connection.Close()時,會觸發sys.sp_reset_connection。這個系統存儲過程大概會做如下事情:

  • 關閉游標
  • 清除臨時對象,比如臨時表
  • 釋放鎖
  • 重置Set選項
  • 重置統計信息
  • 回滾未提交的事務
  • 切換到連接的默認數據庫
  • 重置Trace Flag

此外,根據BOL上的信息:

       "The sp_reset_connection stored procedure is used by SQL 
Server to support remote stored procedure calls in a transaction. This stored 
procedure also causes Audit Login and Audit Logout events to fire when a 
connection is reused from a connection pool."
    

可以知道不能顯式的在SQL Server中調用sys.sp_reset_connection,此外,這個方法還會觸發Audit Login和Audit Logout事件。

一個簡單的示例

下面我們通過一個簡單的示例來看連接池的使用:

首先我分別使用四個連接,其中第一個和第二個連接之間有10秒的等待時間:

      String ConnectionString = "
      
        data source=.\\sql2012;database=AdventureWorks;uid=sa;pwd=sasasa
      
      ";
        SqlConnection cn1=new SqlConnection(ConnectionString);
        SqlCommand cmd1=cn1.CreateCommand();
        cmd1.CommandText="
      
        SELECT * FROM dbo.ABCD
      
      ";
        cn1.
      
        Open
      
      ();
        cmd1.ExecuteReader();
        cn1.
      
        Close
      
      ();
        Response.
      
        Write
      
      ("
      
        連接關閉時間:
      
      "+
      
        DateTime
      
      .Now.ToLongTimeString()+"
      
        <br />
      
      ");
        
        System.Threading.Thread.Sleep(10000);

          SqlConnection cn2=new SqlConnection(ConnectionString);
        SqlCommand cmd2=cn2.CreateCommand();
        cmd2.CommandText="
      
        SELECT * FROM dbo.ABCD
      
      ";
        cn2.
      
        Open
      
      ();
        cmd2.ExecuteReader();
        cn2.
      
        Close
      
      ();
        Response.
      
        Write
      
      ("
      
        連接關閉時間:
      
      "+
      
        DateTime
      
      .Now.ToLongTimeString()+"
      
        <br />
      
      ");

       

            SqlConnection cn3=new SqlConnection(ConnectionString);
        SqlCommand cmd3=cn3.CreateCommand();
        cmd3.CommandText="
      
        SELECT * FROM dbo.ABCD
      
      ";
        cn3.
      
        Open
      
      ();
        cmd3.ExecuteReader();
        cn3.
      
        Close
      
      ();
        Response.
      
        Write
      
      ("
      
        連接關閉時間:
      
      "+
      
        DateTime
      
      .Now.ToLongTimeString()+"
      
        <br />
      
      ");

        System.Threading.Thread.Sleep(1500);

        SqlConnection cn4=new SqlConnection(ConnectionString);
        SqlCommand cmd4=cn4.CreateCommand();
        cmd4.CommandText="
      
        SELECT * FROM dbo.ABCD
      
      ";
        cn4.
      
        Open
      
      ();
        cmd4.ExecuteReader();
        cn4.
      
        Close
      
      ();
        Response.
      
        Write
      
      ("
      
        連接關閉時間:
      
      "+
      
        DateTime
      
      .Now.ToLongTimeString()+"
      
        <br />
      
      ");
    

下面我們通過Profile截圖:

1

我們首先可以看到,每一次Close()方法都會觸發exec sp_reset_connection

此外,我們在中間等待的10秒還可以看到SP51是不斷的,剩下幾個連接全部用的是SPID51這個連接,雖然Ado.net Close了好幾次,但實際上物理連接是沒有中斷的。

因此可以看出,連接池大大的提升了效率。

Ado.net的連接池


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产免费视频 | 美女超碰 | 人人模人人干 | 激情久久久久 | 国产91久久最新观看地址 | 亚洲第一区精品观看 | 免费网址在线观看 | 国产中文视频 | 男人添女人下面免费网站 | 一区不卡 | 久久精品视频在线观看 | 蜜臀视频在线播放 | 欧美激情精品久久久久久久 | 成年免费视频 | 成年人免费网 | 日本中文字幕网站 | 一级片亚洲 | 欧美视频一区二免费视频 | 龙珠z国语版在线观看 | 老司机午夜免费精品视频 | 无限看片在线版免费视频大全 | 男女配种超爽免费视频 | 三级在线网站 | 天天操网 | 欧美激烈精交gif动态图18p | 国产精品无码专区在线观看 | 成人午夜动漫在线观看 | 日本一区二区不卡 | 日本精品久久久久中文字幕 | 天堂一区二区三区 | 午夜电影免费看 | 亚洲视频一区二区 | 亚洲精品乱码久久久久久9色 | 国产精品国产成人国产三级 | 免费v片| 欧美男人天堂 | 丁香婷婷色综合亚洲小说 | 奇米影视在线 | 亚洲成人黄色在线 | 久久亚洲精品国产亚洲老地址 | 国产se|