前一陣開發一套系統,同組的同事提供了一個數據庫連接組件,是他自己封裝的,使用了自定義的連接池,用着很是不爽,而且經常會因為程序不嚴謹的原因,導致連接池里的連接被用完,也導致其他錯誤,因此我想自己研究一下ado.net 的連接池。
其實很早以前,我就接觸過連接池,只是從來沒有實際使用過,在我的印象里,一個連接池應該是跟SqlConnection,MySqlConnection等差不多,都是實現了IDBConnection 接口,這樣程序在使用的時候,是沒有任何代碼入侵,只是在new 一個connection 的時候,從連接池中獲取,同事的這個連接池實在不符合我的審美。
但是當我從網上開始搜資料時,卻發現,其實 Ado.net底層已經支持連接池,根本不需要我們自己開發!!!
在Ado.net 中,連接池的行為可以通過連接字符串來控制,主要包括四個重要的屬性:
- Connection Timeout:連接請求等待超時時間。默認為15秒,單位為秒。
- Max Pool Size: 連接池中最大連接數。默認為100。
- Min Pool Size: 連接池中最小連接數。默認為0。
- Pooling: 是否啟用連接池。ADO.NET默認是啟用連接池的,因此,你需要手動設置Pooling=false來禁用連接池。
我發現了下面這篇文章:
http://www.cnblogs.com/liuhaorain/archive/2012/02/19/2353110.html
另外,因為我們用了Mysql 數據庫,類庫不是微軟提供的,所以我擔心mysql 沒有實現連接池,所以自己測試了一下,結果很明顯,mysql 也同樣支持。
附測試代碼和結果:
class Program { static void Main(string[] args) { MySqlConnection conn = new MySqlConnection(ConfigurationManager.ConnectionStrings["mysql"].ConnectionString); DateTime startTime = DateTime.Now; Console.WriteLine(startTime.ToLongTimeString()); for (int i = 0; i < 100; i++) { conn.Open(); conn.Close(); } DateTime endTime = DateTime.Now; Console.WriteLine(endTime.ToLongTimeString()); Console.WriteLine("連接100次,使用時間(ms):"+(endTime-startTime).ToString()); Console.ReadLine(); } }
配置文件:
啟用連接池:(默認的)
<add name="mysql" connectionString="server = 192.168.2.101; user id = root; password = password; database = Test; Pooling=true;"/>
不啟用連接池:
<add name="mysql" connectionString="server = 192.168.2.101; user id = root; password = password; database = Test; Pooling=false;"/>
每種配置我都運行了三遍:
使用連接池的時候,執行100次時間為0.477秒
不使用連接池的時候,時間是6.56 秒,相差極大。
總之,在Ado.net 里,不需要自己實現連接池,只要設置好參數就可以了。
