.NET 中合理使用鏈接池

       

  1. 背景
    1. 前幾天在評教的過程當中出現了問題,當評教的人數愈來愈多的時候,服務器的壓力也愈來愈大,CPU資源佔用過多達到90%-100%左右,不知道是服務器配置太低,仍是系統設計的有問題。
  1. 解決方法
    1. 經過綜合分析各類可能的緣由,首先,對服務器進行了一些設置,對資源使用進行一些限制。
      1. 設置應用程序池的回收時間爲1720小時,也能夠更改。
      2. CUP或內存超過多少以後,自動回收內存。
    1. 上面的設置是對於全部程序適用,不是針對某一個網站,這臺服務器的配置應該能夠運行起這個系統,極可能是程序中有些資源佔用過多,因而檢查了幾遍代碼是否有循環之類的問題,還有是對數據庫訪問的控制,大數據量的打開、關閉數據庫是很佔用時間、空間資源的。
    2. 使用鏈接池鏈接數據庫
      1. 大多數 ADO.NET 對象使用鏈接池,以提升圍繞 Microsoft 斷開鏈接數據庫的性能。
        1. 應用程序首先打開一個鏈接(或從鏈接池得到一個鏈接句柄),接着運行一個或多個SQL語句,而後處理,最後將鏈接釋放回鏈接池。若是沒有鏈接池,這些應用程序將花費許多額外時間來打開和關閉鏈接。
      1. 鏈接字符串
        1. ADO.Net 中的鏈接池大小能夠經過數據庫鏈接字符串來控制,例如:
          1. stringconStr ="server=192.168.24.165.;uid=sa;pwd=tcaccp;database=pubs;pooling=true;min pool size=5;max pool size=10".
          2. 其中 pooling 表示是否打開鏈接池,默認爲打開,關掉時須要 pooling = false;
          3. min pool size 表示鏈接池最少保存幾個鏈接對象;
          4. max pool size 表示鏈接池最多保存幾個鏈接對象。(最大值不能爲 0,也不能小於最小值);
        1. 最大鏈接數表示同時刻最多容許的訪問的數量,能夠起到保護站點的做用;最小表示即便沒有訪問也會打開幾個鏈接。
      1. 代碼
        1.         #region 批量導入DataTable 未使用事務
                  /// <summary>
                  /// 批量導入DataTable 未使用事務
          		/// </summary>
          		/// <param name="dt">DataTable數據表</param>
          		/// <param name="tableName">表名</param>
          		/// <param name="dtColum">列名</param>
          		public Boolean InsertTable(DataTable dt, string tableName, DataColumnCollection dtColum){
                      //打開數據庫
                      GetConn();
          
                      try
                      {
          
                          //聲明SqlBulkCopy ,using釋放非託管資源
                          using (SqlBulkCopy sqlBC = new SqlBulkCopy(sqlConn))
                          {
          
          
                              //一次批量的插入的數據量
                              //sqlBC.BatchSize = 1000;
                              //超時以前操做完成所容許的秒數,若是超時則事務不會提交 ,數據將回滾,全部已複製的行都會從目標表中移除
                              //sqlBC.BulkCopyTimeout = 60;
          
                              //設定 NotifyAfter 屬性,以便在每插入10000 條數據時,呼叫相應事件。 
                              //sqlBC.NotifyAfter = 10000;
                              // sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
          
                              //設置要批量寫入的表
                              sqlBC.DestinationTableName = tableName;
          
                              //自定義的datatable和數據庫的字段進行對應
                              //sqlBC.ColumnMappings.Add("id", "tel");
                              //sqlBC.ColumnMappings.Add("name", "neirong");
                              for (int i = 0; i < dtColum.Count; i++)
                              {
                                  sqlBC.ColumnMappings.Add(dtColum[i].ColumnName.ToString(), dtColum[i].ColumnName.ToString());
                              }
                              //批量寫入
                              sqlBC.WriteToServer(dt);
                          }
                          //  conn.Dispose();
                          //GetConn();
                          return true;
                      }
                      catch
                      {
                          return false;
          
                      }
                      finally
                      {
                          //關閉數據庫
                          sqlConn.Close();
                      }
                  }
                  #endregion

          向數據庫中批量插入數據,這裏用了using,自動關閉鏈接,不光能導入命名空間,還能在程序體內,局部使用某個對象。像上邊代碼,sqlCon 的做用域只有 using 對應的大括弧這麼大。更神奇的是,using 能夠在對象做用域結束時,自動調用 sqlCon.Dispose()將對象釋放,因此以上代碼中,沒有 sqlCon.Close() 和 sqlCon.Dispose(),一樣能夠釋放資源,放回鏈接池.
        2. using詳細用法:http://blog.csdn.net/zhangyingjie09/article/details/8876451
      1. 監控鏈接池的狀態
        1. 監控鏈接池有多種方法,這裏主要介紹兩種比較經常使用的,每種方法的側重點是不一樣的,因此,也沒有誰好誰壞。
        2. 經過監控驅動程序得到鏈接池情況
          1. 個人電腦(右鍵)-->管理-->系統工具-->性能日誌和警報-->計數器日誌上點擊右鍵,新建日誌設置,隨便起名 abc,出現設置對話框,「添加對象」,下拉列表中選 「.NET Data Provider for SqlServer」,添加,關閉。以下圖
          1. 數據採樣間隔,好比 1 秒採集一次。切換到「日誌文件」選項卡,將日誌文件類型設置爲「文本文件(逗號分隔)」,日誌就會默認記錄在「C:\PerfLogs\abc_000001.csv」裏,點肯定關閉窗體。
          1. 回到「日誌計數窗體」,若是添加的日誌爲綠色表示,已經啓動。
        1. SQL Profiler事件探查器
          1. 事件探查器的功能是監視SQL Server數據庫系統引擎事件,主要用於監視SQL SERVER系統的運行性能。
          1. Profiler能夠用來捕獲發送到SQL Server的全部語句以及語句的執行性能相關數據(如語句的read/writes頁面數目,CPU的使用量,以及語句的duration等)以供之後分析。
          1. 調試SQL語句、存儲過程、識別執行慢的語句。以下圖
            1. 設置模板
            1. 分析數據
    1. 鏈接池是一個很好的程序功能,幫助程序管理大量數據庫鏈接,但你是否會有效的管理鏈接池對於鏈接池是否是發揮出好的做用相當重要,就像一個企業有不少高手是不夠,還須要一個好的管理者來管理,才能讓他們發揮最大的價值。
  1. 總結
    1. 開發系統的時候應該作一部分,調試一部分,便於之後維護
    2. 分析軟件使用目的:是否涉及到性能問題,若是對性能要求高的系統,須要考慮下性能。
相關文章
相關標籤/搜索