前篇回顧:應用程序池在項目中引發的問題不多,不過如果遇到了沒有經歷過的話可能會比較茫然,呵呵。當然重點還是數據庫連接池與線程池了。
本篇蟲子就結合demo程序給大家演示下數據庫連接池會給大家的程序帶來什麼樣的影響。
private string mConnectionString = "server=127.0.0.1;uid=chongzi;pwd=123456;database=AntiXSS;Connection Reset=FALSE;Max Pool Size=15"
連接字符串中設定池化,池的最大數目爲15
[Serializable] public class DAL : IDisposable { public DAL() { DbHelper dh = new DbHelper(); DataSet ds = dh.excSqlRetDataSet("select getdate()"); Console.WriteLine(ds.Tables[0].Rows[0][0].ToString()); } public void Dispose() { } } public DataSet excSqlRetDataSet(string sqlString) { DataSet ds = null; if (sqlString.Length == 0) { return ds; } for (int i = 0; i < 20; i++) { SqlConnection conn = new SqlConnection(mConnectionString); ds = new DataSet(); string sqlCommand = sqlString; SqlDataAdapter da = new SqlDataAdapter(sqlCommand, conn); da.Fill(ds); //注意了 我這裏沒有關閉鏈接 //conn.Close(); } return ds; }
初始數據庫連接數1
啓動控制檯應用程序
開啓3個進程
4個!!! 很好 至於爲什麼不是61個 蟲子先賣個關子留到下面再說
那麼 我們換成pooling=false看看
private string mConnectionString = "server=127.0.0.1;uid=chongzi;pwd=123456;database=AntiXSS;Connection Reset=FALSE;Pooling=FALSE";
初始是1個
我們同樣開3個進程
看結果
1個~ ~
Conn這個鏈接對象我一直沒有手動釋放它。
對於這種現象我的解釋是:
ADO.NET不依賴於ole db提供程序,而是使用.net託管提供的程序,可以斷開connection而保留當前數據集可用,也就是非連接的方式。通常我們的程序默認是池化的,據庫連接池中可能存在着多個沒有被使用的連接一直連接着數據庫。
總結一下:
池化,提高性能,但是同時會提高連接數。至於連接是否活動帶來的影響未作分析。
非池化,性能一般,但是連接每次都是自動釋放。
而且現在大家的應用程序當中,很多都是配置了池化但是實現了非池化。
回到上面的那個問題,爲什麼沒有出現61個。
我們來修改下代碼
public DataSet excSqlRetDataSet(string sqlString) { DataSet ds = null; if (sqlString.Length == 0) { return ds; } for (int i = 0; i < 20; i++) { SqlConnection conn = new SqlConnection(mConnectionString); conn.Open(); //ds = new DataSet(); //string sqlCommand = sqlString; //SqlDataAdapter da = new SqlDataAdapter(sqlCommand, conn); //da.Fill(ds); //注意了 我這裏沒有釋放鏈接 //conn.Close(); } return ds; }
改哪裏 自己找吧 蟲子就不多說了 嘿嘿看效果圖 初始化就不接了 同樣3個進程
看到這裏不需要蟲子解釋 你們也應該都懂了 .net如此爲大家着想 是好事還是壞事 各自評定了。