.NET中的連結池概述

來源:互聯網
上載者:User

ADO.Net 在資料庫操作過程中預設開啟了串連池,不需要再進行手工配置。這個特性可以使資料庫操作時效率提高,但也要有相應的代碼配合,才能真正提高程式效率。

1、連接字串

    ADO.Net 中的串連池大小可以通過資料庫連接字串來控制,例如:

    string cs =

    "server=.;uid=sa;pwd=tcaccp;database=pubs;pooling=true;min pool size=5;max pool size=10"

    其中 pooling 表示是否開啟串連池,預設為開啟,關掉時需要 pooling = false;

    min pool size 表示串連池最少儲存幾個連線物件;

    max pool size 表示串連池最多儲存幾個連線物件。(最大值不能為 0,也不能小於最小值)

    配置好以後,通過 SqlConnection con = new SqlConnection(cs); 即可得到一個屬於串連池的連線物件。

    但一定要注意,連接字串的任何改動,系統都會認為是另一個完全不同的資料庫連接,將會建立新的串連池,這必然會造成更大的系統開銷。所以,為了保證某些連線物件屬於一個串連池,連接字串不能有任何變化,包括大小寫,包括空格,都不能有任何變化。   

2、程式中的改動

    普通的資料庫操作:

    SqlConnection con = new SqlConnection(cs);

    try

    {

       con.Open();

       //進行各種資料庫操作

    }

    catch(Exception ex){ Console.WriteLine(ex.Message); }

    finally

    {

       con.Close();

       con.Dispose();

    }

    這個過程很繁瑣,每次都要在操作完畢後保證連線物件的關閉和資源釋放。在開啟串連池特性以後,finally 中的內容,其實是將連線物件的狀態置為關閉,然後放回到串連池中。既然系統知道要放回串連池,那有沒有什麼更好的方法呢?

    using(SqlConnection con = new SqlConnection(cs))

    {

       try

       {

          con.Open();

          // Do Something......

       }

        catch(Exception ex){ Console.WriteLine(ex.Message); }
    }

    .Net 中的 using 語句,不光能匯入命名空間,還能在程式體內,局部使用某個對象。像上邊代碼,con 的範圍只有 using 對應的大括弧這麼大。更神奇的是,using 可以在對象範圍結束時,自動調用 con.Dispose()將對象釋放,所以以上代碼中,沒有 con.Close() 和 con.Dispose(),同樣可以釋放資源,放回串連池,省了 finally 和手工關閉的麻煩。但同時需要注意,using 既然是在結束範圍時是自動調用對象的 Dispose()方法,那就是說不是什麼類型的對象都可以用 using 的方式自動釋放,必須要實現 IDispose 介面。

3、監控串連池的狀態

    串連池在工作狀態下,是完全由系統來進行控制的,那如何監控串連池中連線物件的資訊呢?

    從兩方面入手:資料庫伺服器 和 資料庫驅動程式。

    資料庫伺服器是連線物件的目的地,通過伺服器狀態的查詢,就能夠看到串連池對伺服器的訪問資訊。拿 SQL Server 2005 為例,執行 sp_who 或者 sp_who2 兩個系統預存程序,就可以看到所有訪問資料庫的串連的列表。比如 min pool size 設定為 5,表示串連池中至少要維護 5 個資料庫物件,程式啟動以後,執行 exec sp_who2 就可以發現,資料庫中有 5 個對應資料庫名的串連,如果沒有操作,其狀態就會處於 sleeping 狀態。

    另一方面,程式的資料庫操作都需要有資料庫驅動程式,既然 ADO.Net 中能夠自動管理串連池,那驅動程式肯定起著相當重要的作用。對驅動程式進行監控,靠得是 Windows 系統中的“效能計數器”功能。

    在我的電腦(右鍵)-->管理-->系統工具-->效能記錄檔及警示-->計數器日誌上點擊右鍵,建立日誌設定,隨便起名 abc,出現設定對話方塊,“添加對象”,下拉式清單中選 “.NET Data Provider for SqlServer”,添加,關閉。

    下邊是資料採樣間隔,比如 1 秒採集一次。切換到“記錄檔”選項卡,將記錄檔類型設定為“文字檔(逗號分隔)”,日誌就會預設記錄在“C:/PerfLogs/abc_000001.csv”裡,點確定關閉表單。

    回到“計數器日誌”視窗,保證剛剛設定的 abc 處於綠色運行狀態,如果是紅色,可以點中 abc ,然後在工具列中點播放按鈕(黑色的三角)讓其啟動。

    設定好後,就可以讓程式運行,其資料庫連接池狀態,連線物件數量,就會在“C:/PerfLogs/abc_000001.csv”裡記錄,需要查看時直接雙擊,用 Excel 開啟即可。開啟的檔案,左側是記錄時間,上方有我們關心的:

    NumberOfPooledConnections :放入池中的連線物件數

    NumberOfActiveConnectionPoolGroups :活動的串連池組的數量

    NumberOfInactiveConnectionPoolGroups :不活動的串連池組的數量

    NumberOfActiveConnectionPools :活動的串連池數量

    NumberOfInactiveConnectionPools :不活動的串連池數量

    根據這些日誌資料,我們就可以在程式運行時監控串連池狀態,並根據這些資料,來調整串連池的相關設定。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.