天天看點

淺談如何更好的打開和關閉ADO.NET連接配接池

MS提倡我們盡可能每次的在連接配接使用完成後就關閉;這樣導緻每次都要進行打開和關閉操作或用using(){…}寫起代碼比較麻煩,還有經常對池的操作似乎也帶來一些性能上的問題;在Asp.net裡一個WebForm經常涉及有N個資料庫操作,為了友善直接在init裡打開一個連接配接,然後在Dispose裡關閉即省事又能減少對池的操作提高性能;那到底這樣做能不能提高性能呢?答案是能,但有些情況估計會很讓你感覺到失望…。當池的連接配接數能應付使用者請求的時候,的确是可以減少池的操作帶來性能的提升;反之就不一樣了使用者必須等待到擷取連接配接後才能進行其他操作,當有更多使用者在等待擷取連接配接的時候隻能讓線程處于更長等待時間導緻服務總體處理能力下降。

以下做一次簡單的測試:

測試方式是使用VS2008自帶的負載測試,測試使用者數是200,資料庫連接配接池數設定20,測度時長10分鐘。

關閉ADO.NET連接配接池測試代碼1:

protected void Page_Load(object sender, EventArgs e)

{

            using (System.Data.SqlClient.SqlConnection sqlconn= new  System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))

            {

                sqlconn.Open();

                System.Threading.Thread.Sleep(300);

            }

}

關閉ADO.NET連接配接池測試代碼2:

        {

            using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))

            {

            System.Threading.Thread.Sleep(50);

            System.Threading.Thread.Sleep(100);

        }

關閉ADO.NET連接配接池測試結果1

<!--[if !vml]-->

498)this.style.width=498;" height=582>

<!--[endif]-->

關閉ADO.NET連接配接池測試結果2

498)this.style.width=498;" height=584>

從以上測試結果來看顯然是MS所提倡的方式在某些情況是更好的,因為随着并發使用者的提高,即用即斷的方式總體上表現效果更佳。還有一點非常重要就是第一種代碼方式會啟用了池的最大資料庫連接配接數,而第二種代碼方式隻使用了6個資料庫連接配接;這一點進一步說明了,即用即斷在某種情況下更節省資料庫連接配接資源。

雖然結果這樣但不代表是什麼情況都使用即用即斷好,當池不會讓使用者在門外等的情況是不需要用的,當N個資料庫操作間沒其他特别耗時的運算最好就用一個連接配接(對于這個耗時多長就根據你實際情況作出權衡了),對于什麼情況應該怎樣做其實通過測試就能找到答案。不過我個人推薦還是用MS提倡的:),本人一向都是采用這種方式。  

本文轉自左正部落格園部落格,原文連結:http://www.cnblogs.com/soundcode/archive/2010/12/29/1921242.html,如需轉載請自行聯系原作者