抓蟲系列(三) 不要輕視web程序中常用的三個"池" 之數據庫連接池

前篇回顧:應用程序池在項目中引發的問題不多,不過如果遇到了沒有經歷過的話可能會比較茫然,呵呵。當然重點還是數據庫連接池與線程池了。

本篇蟲子就結合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如此爲大家着想 是好事還是壞事 各自評定了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章