`
北极的。鱼
  • 浏览: 151229 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】C# Sql连接池

阅读更多

使用连接池

连接到数据库服务器通常由几个需要软长时间的步骤组成。必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次连接,必须分析连接字符串信息,必须由服务器对连接进行身份验证,等等。

实际上,大部份的应用程序都是使用一个或几个不同的连接配置。当应用程序的数据量和访问量大的时候,这意味着在运行应用程序的过程中,许多相同的连接将反复地被打开和关闭,从而会引起数据库服务器效率低下甚至引发程序崩溃。为了确保应用程序的稳定和降低性能成本,我们可以在ADO.NET中使用称为连接池的优化方法来管理维护连接。

连接池可以减少创建连接的次数。定义最小连接数(固定连接数),当用户在连接上调用 Open,连接池就会检查池中是否有可用的连接。如果发现有连接可用,会将该连接返回给调用者,而不是创建新连接。应用程序在该连接上调用 Close 时,连接池会判断该连接是否在最小连接数之内,如果“是”会将连接回收到活动连接池中而不是真正关闭连接,否则将烧毁连接。连接返回到池中之后,即可在下一个 Open 调用中重复使用。

 

创建连接池
以下示例使用C# 连接SQL数据库:

 

class DbConn 
    { 
        //using System.Data; 
        //using System.Data.SqlClient; 
        private const int MaxPool = 10;         //最大连接数 
        private const int MinPool = 5;          //最小连接数 
        private const bool Asyn_Process = true; //设置异步访问数据库 
        private const bool Mars = true;         //在单个连接上得到和管理多个、仅向前引用和只读的结果集(ADO.NET2.0) 
        private const int Conn_Timeout = 15;    //设置连接等待时间 
        private const int Conn_Lifetime = 15;   //设置连接的生命周期 
        private string ConnString = "";         //连接字符串       
        private SqlConnection SqlDrConn = null; //连接对象

        public DbConn()//构造函数 
        { 
            ConnString = GetConnString(); 
            SqlDrConn = new SqlConnection(ConnString); 
        }

        private string GetConnString() 
        { 
            return "server=localhost;" 
                + "integrated security=sspi;" 
                + "database=pubs;" 
                + "Max Pool Size=" + MaxPool + ";" 
                + "Min Pool Size=" + MinPool + ";" 
                + "Connect Timeout=" + Conn_Timeout + ";" 
                + "Connection Lifetime=" + Conn_Lifetime + ";" 
                +"Asynchronous Processing=" + Asyn_Process + ";"; 
                //+ "MultipleActiveResultSets=" + Mars + ";"; 
        } 
        
        public DataTable GetDataReader(string StrSql)//数据查询 
        {                     
            //当连接处于打开状态时关闭,然后再打开,避免有时候数据不能及时更新 
            if (SqlDrConn.State == ConnectionState.Open) 
            { 
                SqlDrConn.Close();                 
            } 
            try 
            { 
                SqlDrConn.Open(); 
                SqlCommand SqlCmd = new SqlCommand(StrSql, SqlDrConn); 
                SqlDataReader SqlDr = SqlCmd.ExecuteReader(); 
                if (SqlDr.HasRows) 
                { 
                    DataTable dt = new DataTable(); 
                    //读取SqlDataReader里的内容 
                    dt.Load(SqlDr); 
                    //关闭对象和连接 
                    SqlDr.Close(); 
                    SqlDrConn.Close();                     
                    return dt; 
                } 
                return null; 
            } 
            catch (Exception ex) 
            { 
                System.Windows.Forms.MessageBox.Show(ex.Message);           
                return null; 
            } 
            finally 
            {         
                SqlDrConn.Close(); 
            } 
        } 
    }

 

通过调用 SqlDrConn.Open()方法打开连接,这时候连接池就会初始化并建立设定的最小连接数。想更清楚了解到连接池的状况可以通过SQL的查询分析器执行存储过程sp_Who,它会列出当前的数据库进程,查看loginname、dbname可以区分用户的连接信息,但要注意的是登录查询分析器本身会使用两个连接,所以最好用另一个用户名登录查询分析器。使用此方法还有一个麻烦地方就是要经常按“执行查询”以更新进程信息。还有另一种方法个人认为较好的,通过 控制面板→管理工具→性能,右击添加计算器,性能对象选择SQlServer:General Statistics(常规统计)然后计算器选择User Connections(用户连接)最后按“添加”就可以实时查看当前连接数。

到了这里,连接池已经实现了, 但问题往往会出现在运行过程中。如连接池的连接数满了该怎样处理?在这里我们应该合理设置连接字符串中的Connect Timeout属性和Connection Lifetime属性(上面有解释)延长等待时间,尽可能地在每次使用完连接之后调用Close方法关闭连接。但从中也有没法避免的,当连接数满了并且申请连接的时间超过设置连接等待的时间时,程序将会引发InvalidOperationExceptio异常,我们可以通过捕获此异常向用户界面提示“系统正忙,请稍后再连接……”之类的信息来缓解这种情况。此外,也有另一种方法来解决这种情况,就是利用ADO.NET 2.0 新特性“异步进程”,对数据库进行异步操作,确保连接能够及时调用Close方法关闭连接,这样能大大减少正在使用的连接数。

使用方法:在连接字符串中加上Asynchronous Processing=true 表示使用异步处理操作。

当应用程序不再需要用到连接池的时候可以使用ClearPool 或 ClearAllPools方法清空连接池也可作重置连接池使用,方法如下:

         SqlConnection.ClearPool(SqlConnection connection) 清空关联的连接池
         SqlConnection.ClearAllPools() 清空所有连接池
调用上述方法,如果连接正在使用,连接池会做相应标记,等连接关闭时自动烧毁。


小结C#连接池
优点:当数据库操作和访问频繁的时候,减少创建连接和打开连接所耗的时间,提升数据库服务器的性能。

缺点:数据库连接池中可能存在着多个没有被使用的连接一直连接着数据库,这意味着资源的浪费。

 

分享到:
评论
1 楼 北极的。鱼 2011-06-01  
在一个页面中只打开一次,只关闭一次打开和关闭数据库.        
下面有一个修改连接池时间的资料,你可参考一下.    
具体操作步骤如下:    
如果是ODBC的话,则可以在ODBC   Data   Source   Administrator中手动更改,该程序位于“Start”菜单中的“Programs”->"Adminstrative   Tools"(中文名:管理工具)下,或从"Control   Panel"(中文名:控制面板)中打开“ODBC   Data   Source   Administrator”(ODBC数据源管理器),再选择“Connection   Pooling”(连接池)选项卡,双击驱动程序中的“SQL   Server”,选择“Pool   Connetions   to   this   drive”(使用池连接该驱动程序),把下面的时间60秒改的大一点,例如120。    
如果是SqlConnection的共享连接,则为ConnectionString属性Connection   Lifetime数值名称指定一个值,该值默认情况下是0,表示连接永远不会从池中被自动移走。如果指定一个不同的值,那么一旦连接被返回到池中,该值将和连接的创建时间及当前时间进行比较。如果生存期超过了Connection   Lifetime的值,那么连接将从池中被移走。

相关推荐

    C#与sqlservr数据库连接代码

    使用C#连接sqlserve数据库代码,轻松实现C#和数据库的连接,实现对数据库中数据的增删改查。

    sqlserver连接池及测试程序

    多年前项目用一个sqlserver连接池,附带测试程序。

    C#连接Oracle,sqlsever,mysql数据库

    C#连接Oracle Mysql sqlsever 三种数据库小示例

    数据库连接池.rar

    c#数据库连接池实例 是现成的实例 DEMO,拿的直接编译,修改下链接就可以用了的实例,数据库连接池非常的不错,带注释,写的很漂亮

    数据库连接池的实现(很完整(支持多种数据库

    这个数据库连接池的实现,包含了源代码,从配置文件读取驱动等相关信息支持Oracle和sql server等多种数据库,里面有写好的测试类

    Hikari数据库连接池

    c#中的数据库连接池是要求数据库客户端驱动提供的,但是很多时候是服务器处理了。很多时候没有看见客户端连接池的方法。所以自己开发了一个数据库连接池。能够像我们平时使用ADO.NET那样使用。

    ADO.NET中SQLServer数据库连接池

    为了使打开的连接成本最低,ADO.NET使用称为连接池的优化方法。连接池减少新连接需要打开的次数。池进程保持物理连接的所有权。通过为每个给定的连接配置保留一组活动连接来管理连接。只要用户在连接上调用Open,池...

    ADO.NET数据连接池剖析

    本篇文章起源于在GCR MVP Open Day的时候和C# MVP张响讨论连接池的概念而来的。因此单独写一篇文章剖析一下连接池。 为什么需要连接池 剖析一个技术第一个要问的是,这项技术为什么存在。 对于每一个到SQL Server的...

    MysqlConnectionPoolCompare--dotNET5.zip

    在代码Program.cs的L17~L21中,填写自己的数据库链接(先在数据库建立对应的表,插入数据,执行single_table.sql此文件即可。mysql) 然后直接执行此控制台程序即可,直到看到输出。 -- 我的这次输出: Default = 620...

    c# log 日志 单体 管理

    出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。 file:DataBaseHlper.cs : 52 2012-10-23 10:15:23 [Error]: connect database error . file: : 0 2012-10-23 10:15:33 [Error]: 正在中止线程。 ...

    SQL 数据库访问类

    if (SqlCon.State == ConnectionState.Open)//判断数据库连接池是否打开 { SqlCon.Close(); } if (SqlParameterList.Count > 0)//判断参数列表是否清空 { SqlParameterList.Clear(); } SqlCon.Dispose();/...

    一个C#的ORM框架

    一个自己写的ORM框架,做了一些连接池和OR映射的功能, 测试效率还行,详情见http://blog.csdn.net/shmilyhe/archive/2009/09/07/4526191.aspx 暂时只支持SQL SERVER 和MYSQL 晚些会上传一些DEMO

    会员系统,整合了mybatis,springboot,DruidDataSource连接池

    该项目利用了基于springboot + vue + mysql的开发模式框架实现的课设系统,包括了项目的源码资源、sql文件、相关指引文档等等。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理...

    青锋管理系统是一个后台系统脚手架,使用springboot、layui前端框架、quartz定时任务、druid数据连接池

    该项目利用了基于springboot + vue + mysql的开发模式框架实现的课设系统,包括了项目的源码资源、sql文件、相关指引文档等等。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理...

    AddPhotoAndTable_C#_

    C#添加图像信息到SQLsERVER数据库中,请确认数据库连接后再测试

    C#.NET案例开发集锦代码7-11章

    第七章 案例1通过委托实现异步调用 案例2使用定时器执行方法 ...连接池实现SQL Server数据库更新 案例3SQL命令或存储过程如何使用参数 案例4使用DataReader处理查询结果 案例6如何显示修改数据库中...

    北京中科信软 Visual Basic.NET培训

    三 ADO.NET 数据库连接与连接池控制 执行数据操作命令 DataReader DataSet ADO.NET中的数据更新 多活动结果集 批量复制 ADO.NET中的异步处理 事务处理机制 LINQ 案例分析:采用N层架构和分布式的大型图书...

Global site tag (gtag.js) - Google Analytics