.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. 分析软件使用目的:是否涉及到性能问题,若是对性能要求高的系统,须要考虑下性能。
相关文章
相关标签/搜索