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 :不活動的串連池數量
根據這些日誌資料,我們就可以在程式運行時監控串連池狀態,並根據這些資料,來調整串連池的相關設定。