日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

      首頁編程開發(fā)其它知識 → SQL Server的Ado.net連接池

      SQL Server的Ado.net連接池

      相關(guān)軟件相關(guān)文章發(fā)表評論 來源:百度搜索時間:2012/11/15 9:48:17字體大。A-A+

      作者:西西點(diǎn)擊:0次評論:0次標(biāo)簽: SQLServer

      為什么需要連接池

      剖析一個技術(shù)第一個要問的是,這項(xiàng)技術(shù)為什么存在。

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

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

      因此,連接池總是能維護(hù)一定數(shù)量的和SQL Server的連接,以便應(yīng)用程序反復(fù)使用這些連接以減少性能損耗

      重置連接的sys.sp_reset_connection

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

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

      關(guān)閉游標(biāo)

      清除臨時對象,比如臨時表

      釋放鎖

      重置Set選項(xiàng)

      重置統(tǒng)計信息

      回滾未提交的事務(wù)

      切換到連接的默認(rèn)數(shù)據(jù)庫

      重置Trace Flag

      此外,根據(jù)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中調(diào)用sys.sp_reset_connection,此外,這個方法還會觸發(fā)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("連接關(guān)閉時間:"+DateTime.Now.ToLongTimeString()+"
      "); 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("連接關(guān)閉時間:"+DateTime.Now.ToLongTimeString()+"
      "); SqlConnection cn3=new SqlConnection(ConnectionString); SqlCommand cmd3=cn3.CreateCommand(); cmd3.CommandText="SELECT * FROM dbo.ABCD"; cn3.Open(); cmd3.ExecuteReader(); cn3.Close(); Response.Write("連接關(guān)閉時間:"+DateTime.Now.ToLongTimeString()+"
      "); 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("連接關(guān)閉時間:"+DateTime.Now.ToLongTimeString()+"
      ");

      下面我們通過Profile截圖:

       

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

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

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

        相關(guān)評論

        閱讀本文后您有什么感想? 已有人給出評價!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評論

        最新評論

        發(fā)表評論 查看所有評論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)
        推薦文章

        沒有數(shù)據(jù)