`
北极的。鱼
  • 浏览: 159010 次
  • 性别: 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# 数据库连接池 C# 数据库连接池

    1. **System.Data.SqlClient.SqlConnection**:这是SQL Server数据库的连接类,支持连接池。在创建`SqlConnection`对象时,如果没有指定`Pooling=false`,则默认启用连接池。 2. **Open() 和 Close()**:`Open()`...

    C#高效数据库连接池源码

    自定义数据库连接池还可以考虑支持多种数据库类型,例如SQL Server、MySQL、Oracle等,通过泛型或接口实现对不同数据库的适配。 理解并掌握C#高效数据库连接池的实现,对于开发高性能的数据库应用至关重要。通过...

    C# 数据库连接池

    例如,SQL Server的连接字符串通常包含"Pooling=true"来开启连接池。 下面是一个简单的C#代码示例,展示了如何使用连接池: ```csharp using System; using System.Data.SqlClient; public class Program { ...

    C# 数据库连接池实例

    数据库连接池是数据库管理中的一个重要概念,特别是在使用像C#这样的编程语言进行数据库操作时,它的存在极大地提高了数据库操作的效率和性能。本实例将深入探讨C#中的数据库连接池,以及如何有效地利用它。 首先,...

    C# 数据库连接池 database pool

    例如,使用`System.Data.SqlClient.SqlConnection`类与SQL Server交互时,连接池会自动管理这些连接。以下是一个使用C#数据库连接池的基本示例代码: ```csharp using System; using System.Data.SqlClient; class...

    c# sql接连池优化

    在C#中,SQL连接池(Connection Pooling)是一种用于管理数据库连接的机制,它能够显著提高应用程序的性能。连接池的基本思想是重用已经创建的数据库连接,而不是每次需要时都新建一个,从而减少创建和销毁连接所...

    cSharp-and-SQL.rar_C#连接sql_c# sql_c# SQL连接_c# sql

    1. 连接池:通过使用连接池,可以重用已打开的连接,减少创建和销毁连接的开销。 2. 数据库事务:在执行多条SQL语句时,使用事务可以确保数据的一致性。 3. 错误处理:捕获并处理可能出现的异常,确保程序的健壮性。...

    sqlserver连接池及测试程序

    "sqlserver连接池及测试程序"这一主题,主要涉及的是SQL Server如何管理和优化数据库连接,以及如何通过测试程序进行性能评估。 连接池是数据库系统中的一个重要概念,它的主要作用是提高数据库应用的性能和效率。...

    C#与sqlservr数据库连接代码

    在IT行业中,C#是一种广泛使用的编程语言,尤其...在实际项目中,还需要考虑异常处理、事务管理、连接池以及代码的可扩展性和安全性。提供的"数据库连接代码.txt"文件可能包含了具体的示例代码,可以进一步学习和参考。

    c#数据库sqlserver连接公共类的实现

    在.NET开发环境中,C#是一种常用的编程语言,而SQL Server是一个功能强大的关系型数据库管理系统。...在实际应用中,可能还需要考虑异常处理、事务管理、连接池等高级特性,以增强代码的健壮性和性能。

    数据库连接池.rar

    数据库连接池是数据库管理技术中的一个重要概念,它在C#编程中被广泛使用,尤其是在.NET框架下处理数据库交互时。数据库连接池通过管理和重用已建立的数据库连接,有效地提高了应用程序的性能,减少了创建和销毁连接...

    sql200连接池配置代码

    以下是一个简单的示例代码,展示了如何在C#中配置SQL Server 2000的连接字符串以启用连接池: ```csharp string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=...

    C# 连接SQL server 数据库

    .NET框架中的连接池机制可以优化性能,通过重用已关闭的连接,减少创建和销毁连接的开销。 在图书管理系统中,这些技术可能被用来管理书籍信息,如添加新书、查找书籍、更新书籍状态等。通过C#连接SQL Server,...

    c#oracle数据库、迷你sql2000连接、sqlserver2008连接

    在实际应用中,还需要考虑异常处理、事务管理、连接池等高级特性以确保程序的稳定性和效率。同时,数据库连接字符串中的各项参数(如服务器地址、端口、数据库名、用户名和密码)需要根据实际环境进行替换。 在文件...

    C# 执行SQL脚本

    在.NET开发环境中,C#是一种常用的编程语言,用于与...在实际应用中,还需要考虑安全性(如防止SQL注入)、性能优化(如批处理、连接池)等方面的问题。在编写代码时,务必遵循最佳实践,确保代码的健壮性和可维护性。

    C#连接SQL数据库

    7. **连接池**:在实际应用中,SQL Server连接池可以优化性能,通过重用已存在的连接而不是每次都需要新建。 学习并熟练掌握这些C#连接SQL数据库的基础知识,对于任何想要在.NET环境中处理数据的开发者来说都是至关...

    C#连接SQLServer数据库

    在IT领域,C#是一种广泛使用的编程语言,...在实际开发中,可能还需要处理异常,优化性能(如使用连接池),以及进行更复杂的查询和事务处理。学习并熟练掌握这些知识点,能让你在使用C#进行数据库操作时更加得心应手。

    C#连接SQL经典例子

    ADO.NET使用连接池来优化性能,它会重用已存在的数据库连接,而不是每次请求时都新建一个。这样做减少了创建和销毁连接所需的时间,提高了应用程序的效率。 9. **安全性**: 在处理用户输入时,必须考虑到安全性...

    c#连接sql的源码

    此外,还应考虑使用连接池来提高性能,以及使用参数化查询或存储过程来防止SQL注入攻击。 总结来说,C#连接SQL的核心在于使用ADO.NET框架,通过SqlConnection、SqlCommand等类来建立、操作数据库连接和执行SQL语句...

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

    以上代码片段展示了C#连接这三种数据库的基本步骤,但实际项目中可能需要处理更多细节,如异常处理、连接池管理、事务处理等。为了实现更复杂的数据操作,如查询、插入、更新和删除,你可以使用ADO.NET提供的...

Global site tag (gtag.js) - Google Analytics