`
shirlly
  • 浏览: 1646530 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

在C#中实现连接池

    博客分类:
  • .NET
阅读更多
使用连接池

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

实际上,大部份的应用程序都是使用一个或几个不同的连接配置。当应用程序的数据量和访问量大的时候,这意味着在运行应用程序的过程中,许多相同的连接将反复地被打开和关闭,从而会引起数据库服务器效率低下甚至引发程序崩溃。为了确保应用程序的稳定和降低性能成本,我们可以在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#连接池
优点:当数据库操作和访问频繁的时候,减少创建连接和打开连接所耗的时间,提升数据库服务器的性能。

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

相关推荐

    c# mysql数据库连接池实现

    在.NET Core中,对于MySQL数据库,我们可以使用`MySql.Data`或`Pomelo.EntityFrameworkCore.MySql`库来实现连接池。 1. 安装依赖库 使用NuGet包管理器安装`Pomelo.EntityFrameworkCore.MySql`或者`MySql.Data`。`...

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

    在C#中,可以使用`System.Data.Common.DbConnection`作为基类,创建自定义的数据库连接类,然后在此基础上实现连接池逻辑。 4. **源码分析**: `ConnectionPool.sln`是解决方案文件,包含项目的整体配置和依赖关系...

    C# 数据库连接池 C# 数据库连接池

    3. **及时关闭事务**:长时间未结束的事务会占用连接池中的连接,导致其他请求无法获取连接。 4. **避免长时运行查询**:长时间运行的查询会占用连接,影响连接池的效率。 5. **测试与监控**:定期评估连接池的...

    C# Socket连接池

    在Socket连接池中,我们可以利用线程池来管理和调度处理网络请求的线程,使得系统能更高效地处理并发请求。 具体实现时,我们可以设计一个连接池类,包含以下几个核心部分: 1. 初始化:设置最大连接数,初始化...

    MySql数据库连接池C#代码(有注释含测试代码)

    在C#编程中,我们可以使用自定义的连接池或者第三方库如ADO.NET的DBConnection类来实现这一功能。本示例包含的代码文件`ConnectionPool.cs`、`TestConnectionPool.cs`和`PooledConnection.cs`提供了自定义数据库连接...

    C# 数据库连接池

    使用完毕后,连接不会立即关闭,而是返回到连接池中供后续使用。这样可以显著减少数据库连接的创建和销毁次数,提高系统性能,尤其是对于高并发的Web应用来说,效果尤为明显。 在C#中,ADO.NET框架内置了对数据库...

    C#编写的数据库连接池

    2. 获取连接:当需要与数据库交互时,从连接池中获取一个可用的连接,如果池中无空闲连接,可以等待或创建新连接。 3. 归还连接:完成数据库操作后,将连接归还到连接池,而不是关闭它。 4. 监控和维护:定期检查...

    C# 数据库连接池实例

    - 在多线程环境中,每个线程不应创建自己的连接,而是共享连接池中的连接,以减少连接创建的次数。 理解并正确使用C#中的数据库连接池,能够显著提升数据库应用的性能,降低资源消耗,尤其在高并发环境下显得尤为...

    RabbitMQ客户端连接池的原理及源码

    5. **池化连接(Pooled Connection)**:是连接池中的实际对象,它是一个包装了RabbitMQ原生连接的代理对象,用于跟踪连接的状态,确保在使用前是有效的,并在使用后正确归还。 6. **超时和健康检查**:连接池会...

    C#中的数据库连接池:原理、实践与性能优化

    在C#中,数据库连接池的实现主要依赖于ADO.NET框架,该框架提供了强大的连接池管理功能。本文将深入探讨C#中数据库连接池的工作原理、如何使用以及性能优化策略。 数据库连接池是提高C#应用程序性能的关键技术。通过...

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

    连接池的基本原理是预先创建一定数量的数据库连接,并将其保存在内存中,当应用程序需要与数据库通信时,不再直接建立新的连接,而是从池中获取一个已存在的连接,用完后再归还给连接池,而不是关闭它。这种机制可以...

    winform数据库连接池源码

    数据库连接池的基本原理是:当一个应用请求一个新的数据库连接时,连接池不会立即创建一个新的连接,而是从已有的连接池中返回一个已存在的、可重用的连接。如果池中没有空闲连接,它会根据预设的规则创建新的连接并...

    c#的mysql数据库连接池源码,已稳定运行多年

    `ManagePool()`函数很可能是用来周期性检查和管理连接池中的连接状态的。在数据库连接长时间无活动时,可能会因为网络问题或服务器重启导致连接失效。因此,设置一个定时检查机制是非常必要的,它可以在预设的时间...

    C# ajax和数据库连接池小实例

    2. .NET Framework中的数据库连接池:在C#中,ADO.NET提供了内置的数据库连接池。例如,使用SqlConnection类连接SQL Server时,系统会自动管理连接池。 3. 连接池的优点:减少创建和销毁连接的开销,提高并发性能,...

    C#中实现数据库连接

    本篇文章将深入探讨如何在C#中实现数据库连接,以及涉及到的相关知识点。 1. **ADO.NET框架**: ADO.NET是.NET Framework的一部分,提供了一组对象模型,用于处理数据库连接、数据读取、数据写入等操作。主要组件...

    实现高效的数据库连接池(附带完整代码C#和Java实现).docx

    3. **GetConnectionFormPool**:从连接池中获取连接,可能涉及等待或新建连接。 4. **DisposeConnection**:将使用过的连接返回给连接池,不直接关闭。 5. **更新属性**:允许动态调整连接池的配置,如最大连接数。 ...

    C#自定义对象池

    在C#中实现自定义对象池,首先需要定义一个类来存储和管理这些对象。这个类通常包含一个队列或字典来保存对象,以及一些方法如获取对象、归还对象等。以下是一个简单的对象池实现框架: ```csharp public class ...

    C#连接人大金仓帮助类.rar

    在C#编程环境中,我们通常需要使用ADO.NET或者第三方库来实现与人大金仓(Kingbase)数据库的连接和交互。这个压缩包“C#连接人大金仓帮助类.rar”可能包含了一些实用的C#类库或示例代码,帮助开发者更方便地进行...

    ActiveMQ连接池完整封装实例工具类

    在ActiveMQ中,我们可以使用PooledConnectionFactory来实现连接池。 以下是一个简化的ActiveMQ连接池工具类实现思路: 1. **初始化配置**:在工具类初始化时,需要配置ActiveMQ服务器的URL、用户名、密码等信息。...

    万能对象池【C#实现】

    总结来说,C#实现的万能对象池是通过泛型和面向对象的设计来提供一种通用的资源管理机制,优化了对象生命周期的管理,减少了垃圾回收的频率,提升了程序运行效率。在实际项目中,根据需求对对象池进行适当的定制和...

Global site tag (gtag.js) - Google Analytics