精华内容
下载资源
问答
  • 使用c#数据库连接池
    2020-12-24 13:44:25

    导读:使用C#数据库连接池,连接到数据库服务器通常由几个需要软长时间的步骤组成,必须与服务器进行初次连接,必须分析连接字符串信息,必须由服务器对连接进行身份验证,大部份的应用程序都是使用一个或几个不同的连接配置,当应用程序的数据量和访问量大的时候,许多相同的连接将反复地被打开和关闭,从而会引起数据库服务器效率低下甚至引发程序崩溃,我们可以在ADO.NET中使用称为连接池的优化方法来管理维护连接,C#

    使用c#数据库连接池使用C#数据库连接池

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

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

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

    创建C#数据库连接池

    以下示例使用C#连接SQL数据库:1. classDbConn2. {3. //usingSystem.Data;

    4. //usingSystem.Data.SqlClient;

    5. private const int MaxPool=10;//最大连接数

    6. private const int MinPool=5;//最小连接数

    7. private const bool Asyn_Process=true;//设置异步访问数据库

    8. //在单个连接上得到和管理多个、仅向前引用和只读的结果集(ADO.NET2.0)

    9. private const bool Mars=true;10. private const int Conn_Timeout=15;//设置连接等待时间

    11. private const int Conn_Lifetime=15;//设置连接的生命周期

    12. private string ConnString="";//连接字符串

    13. private SqlConnection SqlDrConn=null;//连接对象

    14.15. public DbConn()//构造函数

    16. {17. ConnString=GetConnString();18. SqlDrConn=newSqlConnection(ConnString);19. }20.21. private stringGetConnString()22. {23. return"server=localhost;"

    24. +"integratedsecurity=sspi;"

    25. +"database=pubs;"

    26. +"MaxPoolSize="+MaxPool+";"

    27. +"MinPoolSize="+MinPool+";"

    28. +"ConnectTimeout="+Conn_Timeout+";"

    29. +"ConnectionLifetime="+Conn_Lifetime+";"

    30. +"AsynchronousProcessing="+Asyn_Process+";";31. //+"MultipleActiveResultSets="+Mars+";";

    32. }33.34. public DataTable GetDataReader(string StrSql)//数据查询

    35. {36. //当连接处于打开状态时关闭,然后再打开,避免有时候数据不能及时更新

    37. if(SqlDrConn.State==ConnectionState.Open)38. {39. SqlDrConn.Close();40. }41. try

    42. {43. SqlDrConn.Open();44. SqlCommandSql Cmd=newSqlCommand(StrSql,SqlDrConn);45. SqlDataReader SqlDr=SqlCmd.ExecuteReader();46. if(SqlDr.HasRows)47. {48. DataTable dt=newDataTable();49. //读取SqlDataReader里的内容

    50. dt.Load(SqlDr);51. //关闭对象和连接

    52. SqlDr.Close();53. SqlDrConn.Close();54. returndt;55. }56. returnnull;57. }58. catch(Exception ex)59. {60. System.Windows.Forms.MessageBox.Show(ex.Message);61. return null;62. }63. finally

    64. {65. SqlDrConn.Close();66. }67. }68. }

    通过调用SqlDrConn.Open()方法打开连接,这时候连接池就会初始化并建立设定的最小连接数。想更清楚了解到连接池的状况可以通过SQL的查询分析器执行存储过程sp_Who,它会列出当前的数据库进程,查看loginname、dbname可以区分用户的连接信息,但要注意的是登录查询分析器本身会使用两个连接,所以最好用另一个用户名登录查询分析器。使用此方法还有一个麻烦地方就是要经常按“执行查询”以更新进程信息。还有另一种方法个人认为

    较好的,通过控制面板→管理工具→性能,右击添加计算器,性能对象选择SQlServer:GeneralStatistics(常规统计)然后计算器选择UserConnections(用户连接)最后按“添加”就可以实时查看当前连接数。

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

    SqlConnection.ClearPool(SqlConnection connection)清空关联的连接池

    SqlConnection.ClearAllPools()清空所有连接池

    调用上述方法,如果连接正在使用,连接池会做相应标记,等连接关闭时自动烧毁。 小结C#数据库连接池

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

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

    更多相关内容
  • C# 连接池

    千次阅读 2018-08-21 14:55:40
    3、 连接池 4、 池的创建和分配 5、 移除连接 6、 以Oracle为例,进行代码演示 6.1 池的创建 6.2 创建连接 6.3 将连接返还给池 6.4 释放连接池 6.5 演示:创建多余2个连接会是什么情况? 6.6 演示:关闭一...

    目录

    1、数据库驱动

    2、 ADO.NET、ADO、OLEDB、ODBC

    3、 连接池

    4、 池的创建和分配

    5、 移除连接

    6、 以Oracle为例,进行代码演示

    6.1 池的创建

    6.2 创建连接

    6.3 将连接返还给池

    6.4 释放连接池

    6.5 演示:创建多余2个连接会是什么情况?

    6.6 演示:关闭一个连接后,等待的连接会自动连接

    6.7 演示:等待超时后并不会自动连接

    6.8 演示:同一个进程中,连接字符串一样的连接共享连接池

    6.9 演示:非同一进程,连接字符串一样的连接不共享连接池

    7、总结


    1、数据库驱动

    数据库驱动是不同数据库开发商(比如oracle mysql等)为了某一种开发语言环境(比如C#、java等)能够实现统一的数据库调用而开发的一个程序接口。

    以Oracle为例:安装了.Net FrameWork 后如果不安装Oracle的客户端,应用程序是无法连接Oracle数据库的,因为.Net的数据库访问API连接oracle时需要调用Oracle的客户端数据库访问驱动,例如我们经常出现的Oracle.DaraAccess.dll之类。

    2、 ADO.NET、ADO、OLEDB、ODBC

    发展史:ODBC->OLEDB->ADO->ADO.Net

    ODBC:最早的通用数据访问接口,但是只支持访问关系型数据库。

    OLEDB:通向不同的数据源的低级应用程序接口,OLE DB不仅包括微软资助的标准数据接口开放数据库连通性(ODBC)的结构化查询语言(SQL)能力,还具有面向其他非SQL数据类型的通路。

    ADO:是OLEDB的简化版本,实在OLEDB接口之上附加的一层,简化了OLEDB的调用。

    ADO.NET:ADO.NET在ADO的基础上进行了扩展和变化,随着支持的数据库类型越来越多、应用的语言特性越来越多譬如Linq to Dataset、实体对象模型的框架等变化太多就被认为是一个新的产品。ADO.Net 是一组向 .NET Framework 程序员公开数据访问服务的类。ADO.NET 提供对诸如 SQL Server 和 XML 这样的数据源以及通过 OLE DB 和 ODBC 公开的数据源的一致访问。

    我的总结:可以认为这一票都是微软在数据访问功能方面设计和封装的一系列编程接口(API)。ODBC是微软关系数据库访问标准,以此标准封装了ODBC、OLEDB这些微软偏底层的接口,调用和操作比较复杂,ADO、ADO.NET是对ODBC、OLEDB的封装和扩展,是高级接口,便于程序员调用。

    3、 连接池

    连接到数据源可能需要很长时间。 打开连接的成本降到最低,ADO.NET 使用称为的优化方法连接池,其中重复打开和关闭连接的成本降至最低。 .NET Framework 数据提供程序处理连接池的方式有所不同。

    连接池使新连接必须打开的次数得以减少。 池进程保持物理连接的所有权。 通过为每个给定的连接配置保留一组活动连接来管理连接。 每当用户在连接上调用 Open 时,池进程就会查找池中可用的连接。 如果某个池连接可用,会将该连接返回给调用者,而不是打开新连接。 应用程序在该连接上调用 Close 时,池进程会将连接返回到活动连接池集中,而不是关闭连接。 连接返回到池中之后,即可在下一个 Open 调用中重复使用。

    4、 池的创建和分配

    在初次打开连接时,将根据完全匹配算法创建连接池,该算法将池与连接中的连接字符串关联。 每个连接池都与一个不同的连接字符串相关联。 打开新连接时,如果连接字符串并非与现有池完全匹配,将创建一个新池。 按进程、应用程序域、连接字符串以及 Windows 标识(在使用集成的安全性时)来建立池连接。 连接字符串还必须是完全匹配的;按不同顺序为同一连接提供的关键字将分到单独的池中。

    5、 移除连接

    如果空闲时间达到大约 4-8 分钟,或池进程检测到与服务器的连接已断开,连接池进程会将该连接从池中移除。 注意,只有在尝试与服务器进行通信之后才能检测到断开的连接。 如果发现某连接不再连接到服务器,则会将其标记为无效。 无效连接只有在关闭或重新建立后,才会从连接池中移除。

    如果存在一个与已消失的服务器的连接,即使连接池进程尚未检测到断开的连接,也可以从池中取出此连接并将连接标记为无效。 这种情况是因为检查连接是否仍有效的系统开销将造成与服务器的另一次往返,从而抵消了池进程的优势。 发生此情况时,初次尝试使用该连接将检测连接是否曾断开,并引发异常。

    6、 以Oracle为例,进行代码演示

    6.1 池的创建

    初次创建连接时,.Net会自动依据连接创建对应的连接池。

     

    6.2 创建连接

    将池的最大和最小连接数都设置为2。

      try
                {
                    m_OrclConnection = new OracleConnection();
                    string sConenctStr = "Persist Security Info = True; Data Source = {0};"
                                        + "User ID = {1}; Password ={2};"
                                        + "Pooling=true;Max Pool Size=2;Min Pool Size=2;";
                    sConenctStr = string.Format(sConenctStr, "ORCL_xxxxxxx", "XXXX", "XXXX");
                    m_OrclConnection.ConnectionString = sConenctStr;
                    Action actionConectStart = () =>
                      {
                          mmeEdit.Text += Environment.NewLine + DateTime.Now.Minute + "分" + DateTime.Now.Second + "秒";
                          mmeEdit.Text += Environment.NewLine + string.Format("开始打开数据库连接...", m_ListConn.Count);
                      };
    
                    Action actionConnecting = () =>
                    {
                        mmeEdit.Text += Environment.NewLine + string.Format("正在等待打开数据库连接...");
                    };
    
                    Action<string> actionConectDone = (time) =>
                    {
                        mmeEdit.Text += Environment.NewLine + DateTime.Now.Minute + "分" + DateTime.Now.Second + "秒";
                        mmeEdit.Text += Environment.NewLine + string.Format("已经打开1个连接,耗时{0}毫秒...", time);
                        mmeEdit.Text += Environment.NewLine;
                    };
    
                     为了不阻塞UI线程,异步执行
                    Task.Run(() =>
                    {
                        mmeEdit.Invoke(actionConectStart);
                        DateTime dateBegin = DateTime.Now;
                        m_OrclConnection.OpenAsync();       // 如果超过连接池最大数,此处会阻塞
                        var consumeTime = DateTime.Now - dateBegin;
                        if (m_OrclConnection.State == ConnectionState.Open)
                        {
                            mmeEdit.Invoke(actionConectDone, new object[] { consumeTime.Milliseconds.ToString() });
                        }
                        else if (m_OrclConnection.State == ConnectionState.Connecting)
                        {
                            mmeEdit.Invoke(actionConnecting);
                        }
                    });
    
                    m_ListConn.Add(m_OrclConnection);
                    mmeEdit.Text += Environment.NewLine + string.Format("共创建了{0}个连接...", m_ListConn.Count);
                }
                catch (Exception ex)
                {
                    mmeEdit.Text += ex.Message;
                }

    6.3 将连接返还给池

    使用Close方法时,并不会关闭连接,而是将连接归还给连接池管理。

    if (m_ListConn.Count > 0)
    {
                        var openConn = m_ListConn.First((item) => item.State ==ConnectionState.Open);                        
                        if (openConn == null)
                        {
                            mmeEdit.Text += Environment.NewLine + "无打开的连接...";
                        }
                        else
                        {
                            mmeEdit.Text += Environment.NewLine;
                            openConn.Close();
                            if (openConn.State == ConnectionState.Open)
                                mmeEdit.Text += Environment.NewLine + "关闭连接失败...";
                            else
                                mmeEdit.Text += Environment.NewLine + "关闭连接成功...";
                        }
                    }

    6.4 释放连接池

     if (m_OrclConnection != null)
                {
                     释放当前连接的连接池
                    OracleConnection.ClearPool(m_OrclConnection);
                    mmeEdit.Text += Environment.NewLine + "清除当前池成功..." + Environment.NewLine;
                    m_ListConn.Clear();
                }
     if (m_OrclConnection != null)
                {
                     释放进程的所有连接池
                    OracleConnection.ClearAllPools();
                    mmeEdit.Text += Environment.NewLine + "清除所有池成功..." + Environment.NewLine;
                    m_ListConn.Clear();
                }

    6.5 演示:创建多余2个连接会是什么情况?

    6.6 演示:关闭一个连接后,等待的连接会自动连接

    6.7 演示:等待超时后并不会自动连接

    等待的时间是有限制的,超时后不会自动连接。

    6.8 演示:同一个进程中,连接字符串一样的连接共享连接池

    打开一个主窗体,在主窗体中打开一个子窗体,在主窗体中先打开两个连接,然后再在子窗体中打开连接会发现打不开连接,说明其共享一个连接池。

    备注:子窗体的代码和主窗体一模一样。

     

    6.9 演示:非同一进程,连接字符串一样的连接不共享连接池

    打开两个应用程序,都打开两个连接。

    7、总结

    • 连接池充当了对活动连接的维护作用,我们代码Close连接后并不会关闭连接而是归还给连接池以供其他逻辑使用,这样我们每次打开连接并不需要建立物理链路,连接登录数据库实例等长时间的连接操作,而是有效的利用了连接池中活动的连接。
    • 连接池的创建比较严格,根据应用程序进程、应用程序域、连接字符串等严格匹配创建,参数顺序不同也会创建不同的连接池。
    • 等待连接的连接是由时间限制的,等待超时需要重新Open。
    • 单线程的进程中,如果是对同一数据库,用同一用户登录,只需创建一个连接,使用之后Close掉,归还给连接池。

     

    参考地址:

    https://www.cnblogs.com/liuzhendong/archive/2012/01/29/2331189.html

    https://docs.microsoft.com/zh-cn/dotnet/framework/data/adonet/

    https://www.cnblogs.com/wangcq/p/3614276.html

    https://docs.microsoft.com/zh-cn/dotnet/framework/data/adonet/ole-db-odbc-and-oracle-connection-pooling

     

     

    展开全文
  • C#在连接字符串中设置连接池 如果使用的是 OleDbConnection、OdbcConnection 或 OracleConnection 类,则连接池将由提供程序自动处理,所以您不必自己进行管理。 如果使用的是 SqlConnection 类,则连接池被隐式管理...

    原由:许多用户可能在查询相同的数据库以获取相同的数据。在这些情况下,可以通过使应用程序共享到数据源的连接来提高应用程序的性能。否则,让每个用户打开和关闭单独的连接的开销会对应用程序性能产生不利影响。这样就有了连接池。

    实现:

    C#在连接字符串中设置连接池
    如果使用的是 OleDbConnection、OdbcConnection 或 OracleConnection 类,则连接池将由提供程序自动处理,所以您不必自己进行管理。

    如果使用的是 SqlConnection 类,则连接池被隐式管理,但也提供选项允许您自己管理池。
    
    连接使用Open()方法打开连接,这时候连接池就会初始化并建立设定的最小连接数。在使用完连接时一定要关闭连接,以便连接可以返回池。要关闭连接使用Close()
    
    当连接数满了并且申请连接的时间超过设置连接等待的时间时,使用“异步进程”,对数据库进行异步操作,确保连接能够及时调用Close方法关闭连接,这样能大大减少正在使用的连接数。
    

    当数据库操作和访问频繁的时候,减少创建连接和打开连接所耗的时间,提升数据库服务器的性能。 这里将详细分析C#数据库连接池。

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

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

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

    创建C#数据库连接池
    以下示例使用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:GeneralStatistics(常规统计)然后计算器选择UserConnections(用户连接)最后按“添加”就可以实 时查看当前连接数。

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

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

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

    SqlConnection.ClearPool(SqlConnectionconnection)清空关联的连接池

    SqlConnection.ClearAllPools()清空所有连接池

    调用上述方法,如果连接正在使用,连接池会做相应标记,等连接关闭时自动烧毁。

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

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

    以上就是c# 连接池的设置与使用的详细内容,更多关于c# 连接池的资料请关注脚本之家其它相关文章!

    展开全文
  • C#连接池

    2019-05-01 21:12:00
    C#数据库连接池 MySql SqlServer 查阅了一天的资料来学习MySql数据库连接池,终于在一篇博文上找到了,自己也整理了一下,希望对大家有用处 1.建立连接池 1 using MySql.Data.MySqlClient; 2 using ...

    查阅了一天的资料来学习MySql数据库连接池,终于在一篇博文上找到了,自己也整理了一下,希望对大家有用处

    1. 建立连接池

    复制代码
      1 using MySql.Data.MySqlClient;
      2 using System;
      3 using System.Collections;
      4 using System.Collections.Generic;
      5 using System.Linq;
      6 using System.Text;
      7 using System.Threading.Tasks;
      8 
      9 namespace LianJieChiTest
     10 {
     11     public class ConnectionPool
     12     {
     13         private static ConnectionPool cpool = null;//池管理对象
     14         private static Object objlock = typeof(ConnectionPool);//池管理对象实例
     15         private int size = 1;//池中连接数
     16         private int useCount = 0;//已经使用的连接数
     17         private ArrayList pool = null;//连接保存的集合
     18         private String ConnectionStr = "";//连接字符串
     19 
     20         public ConnectionPool()
     21         {
     22             //数据库连接字符串
     23             ConnectionStr = "server=localhost;User ID=root;Password=123456;database=test;";
     24             //创建可用连接的集合
     25             pool = new ArrayList();
     26         }
     27 
     28         #region 创建获取连接池对象
     29         public static ConnectionPool getPool()
     30         {
     31             lock (objlock)
     32             {
     33                 if (cpool == null)
     34                 {
     35                     cpool = new ConnectionPool();
     36                 }
     37                 return cpool;
     38             }
     39         }
     40         #endregion
     41 
     42         #region 获取池中的连接
     43         public MySqlConnection getConnection()
     44         {
     45             lock (pool)
     46             {
     47                 MySqlConnection tmp = null;
     48                 //可用连接数量大于0
     49                 if (pool.Count > 0)
     50                 {
     51                     //取第一个可用连接
     52                     tmp = (MySqlConnection)pool[0];
     53                     //在可用连接中移除此链接
     54                     pool.RemoveAt(0);
     55                     //不成功
     56                     if (!isUserful(tmp))
     57                     {
     58                         //可用的连接数据已去掉一个
     59                         useCount--;
     60                         tmp = getConnection();
     61                     }
     62                 }
     63                 else
     64                 {
     65                     //可使用的连接小于连接数量
     66                     if (useCount <= size)
     67                     {
     68                         try
     69                         {
     70                             //创建连接
     71                             tmp = CreateConnection(tmp);
     72                         }
     73                         catch (Exception e)
     74                         {
     75                         }
     76                     }
     77                 }
     78                 //连接为null
     79                 if (tmp == null)
     80                 {
     81                     //达到最大连接数递归调用获取连接否则创建新连接
     82                     if (useCount <= size)
     83                     {
     84                         tmp = getConnection();
     85                     }
     86                     else
     87                     {
     88                         tmp = CreateConnection(tmp);
     89                     }
     90                 }
     91                 return tmp;
     92             }
     93         }
     94         #endregion
     95 
     96         #region 创建连接
     97         private MySqlConnection CreateConnection(MySqlConnection tmp)
     98         {
     99             //创建连接
    100             MySqlConnection conn = new MySqlConnection(ConnectionStr);
    101             conn.Open();
    102             //可用的连接数加上一个
    103             useCount++;
    104             tmp = conn;
    105             return tmp;
    106         }
    107         #endregion
    108 
    109         #region 关闭连接,加连接回到池中
    110         public void closeConnection(MySqlConnection con)
    111         {
    112             lock (pool)
    113             {
    114                 if (con != null)
    115                 {
    116                     //将连接添加在连接池中
    117                     pool.Add(con);
    118                 }
    119             }
    120         }
    121         #endregion
    122 
    123         #region 目的保证所创连接成功,测试池中连接
    124         private bool isUserful(MySqlConnection con)
    125         {
    126             //主要用于不同用户
    127             bool result = true;
    128             if (con != null)
    129             {
    130                 string sql = "select 1";//随便执行对数据库操作
    131                 MySqlCommand cmd = new MySqlCommand(sql, con);
    132                 try
    133                 {
    134                     cmd.ExecuteScalar().ToString();
    135                 }
    136                 catch
    137                 {
    138                     result = false;
    139                 }
    140 
    141             }
    142             return result;
    143         }
    144         #endregion
    145     }
    146 }
    复制代码

    2. 使用

    复制代码
     1 MySqlConnection conn = null;
     2 for (int i = 1; i <= 100000; ++i)
     3 {
     4         //获取连接
     5         conn = ConnectionPool.getPool().getConnection();
     6         try
     7         {
     8              //数据操作
     9              MySqlCommand cmd = new MySqlCommand("Select * from zhy_testLianJie", conn);
    10              MySqlDataReader dr = cmd.ExecuteReader();
    11              while (dr.Read())
    12              {
    13                   Console.WriteLine("ID:" + i + ",姓名:" + dr[1]);
    14               }
    15               dr.Close();
    16               //将连接添加回连接池中
    17               ConnectionPool.getPool().closeConnection(conn);
    18         }
    19         catch (Exception ex)
    20         {
    21            Console.WriteLine("\n异常信息:\n{0}", ex.Message);
    22            break;
    23         }
    24 }                
    复制代码

    这里是MySql的使用方法,SqlServer与之相差就是去掉所有对象的“My”,希望可以帮助到大家

    转载于:https://www.cnblogs.com/developer-ios/p/10800791.html

    展开全文
  • c#连接池New

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

    热门讨论 2010-10-27 17:48:32
    C# 数据库连接池 C# 数据库连接池 C# 数据库连接池 C# 数据库连接池
  • C#高效数据库连接池源码

    热门讨论 2012-11-20 10:32:30
    C#高效数据库连接池源码
  • 本文将使用一个Github开源的组件库技术来实现连接池的操作,应用于一些情况下的频繁的网络连接操作。 github地址:https://github.com/dathlin/HslCommunication如果喜欢可以star或是fork,还可以打赏支持,打赏请...
  • C#数据库连接池

    千次阅读 2020-09-01 17:38:24
    C#数据库连接池 using MySql.Data.MySqlClient; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { public class Connection...
  • c#数据库连接池

    2020-08-05 14:09:01
    SqlConnection sqlConnection = new SqlConnection( "server=192.168.0.103;database=HealthDB;uid =sa;pwd = 666666;" + "pooling = true;... //最大连接数,最小连接数 sqlconnection.open();//
  • 原文标题:关于ADO.Net连接池(Connection Pool)的一些个人见解 一下是原文: 建立池连接可以显著提高应用程序的性能和可缩放性。SQL Server .NET Framework 数据提供程序自动为 ADO.NET 客户端应用...
  • 摘要:下文将详细讲述数据库连接池相关信息,如下所示:在c#操作sqlserver数据库时,需使用open打开一个数据库连接,此时应用程序将会同数据库之间产生一个连接,我们可以通过此连接发送sql脚本命令,当sql命令执行完毕...
  • 有测试代码和注释。可以参考,代码并不完美,很多地方可以修改,还望高手指点。
  • c#连接池

    千次阅读 2011-02-11 21:04:00
    实现高效的数据库连接池(附带完整代码C#和Java实现) 收藏 相关技术:连接池引用记数多线程C#.NetJava<br />适宜人群数据库应用程序程序员系统分析员模块设计师有一定功底的程序员 目录引言...
  • RabbitMQ客户端连接池的原理及源码

    热门讨论 2015-04-18 19:24:15
    RabbitMQ客户端连接池的原理及源码,经过仔细功能测试和性能测试的
  • a database connection pool source with example code.
  • 概述数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。那么其中的运行机制又是怎样的呢?今天主要介绍一下数据库连接池原理和常用的连接池。01 ...
  • C# SqlConnection 连接池

    2021-12-06 15:13:28
    C# 连接SqlServer的连接池相关说明
  • C#MySQL连接池

    2021-02-06 14:40:13
    我正在使用C#多线程应用程序并使用MySQL与整个应用程序的单一连接.但是当两个或多个线程同时尝试访问数据库时,我得到以下错误:There is already an open DataReader associated with this Connection which must be...
  • 一、导读使用C#数据库连接池,连接到数据库服务器通常由几个需要软长时间的步骤组成:1、必须与服务器进行初次连接;2、必须分析连接字符串信息;3、必须由服务器对连接进行身份验证;4、必须建立物理通道(例如套接...
  • C# 数据库连接池实例

    热门讨论 2010-03-25 16:40:34
    所有的的连接都在一个队列里,当在制定的时间内,不再使用时,释放。如果连续使用则不释放。
  • C# 基于创建一个mysql 连接池

    千次阅读 2019-10-02 11:20:13
    创建一个连接池操作类 using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; namespace CommonAssistant { ...
  • 正确的理解这个连接池机制,有助于我们编写高效的数据库应用程序。 很多人认为 SqlConnection 的连接是不耗时的,理由是循环执行 SqlConnection.Open 得到的平均时间几乎为0,但每次首次open 时,耗时又往往达到几个...
  • //默认情况下.net启用了连接池,反复开关1000次时间非常短,若禁用连接池使pooling = false;则消耗时间为原来的上千倍 //当启用ado.net连接池后,其实只会创建一个连接对象,并且该连接对象默认并不会立刻关闭,后面...
  • 关于c#连接池:(以OracleConneciton为例)1,默认c#的windows application的程序进程是创建connection pool的(Pooling=false不创建connection pool);默认最大连接数(Max Pool Size)为100;new一个连接,如果...
  • C# 数据库连接池

    2018-01-16 08:51:05
    c# 数据库连接池管理类,有效统一管理数据库连接,非常好用,自己项目在用!!!
  • C#连接redis

    2018-03-01 14:52:48
    C#连接redis,并能成功运行,希望对鞋同有帮助。连接文件也是从网上找的,但是大多数不能用,这个绝对能用。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,109
精华内容 8,043
关键字:

c#连接池

c# 订阅
友情链接: stdafx_h.rar