C#中使用MySql连接池

1.连接池的创建

using System.Collections;
using MySqlConnector;

namespace service
{
        public class ConnectionPool
        {
            private static ConnectionPool cpool = null;//池管理对象
            private static Object objlock = typeof(ConnectionPool);//池管理对象实例
            private int size = 1;//池中连接数
            private int useCount = 0;//已经使用的连接数
            private ArrayList pool = null;//连接保存的集合
            private String ConnectionStr = "";//连接字符串

            public ConnectionPool()
            {
                //数据库连接字符串
                ConnectionStr = "server=localhost;userid=root;password=colin123;database=occupation;";
                //创建可用连接的集合
                pool = new ArrayList();
            }

            // 创建获取连接池对象
            public  ConnectionPool getPool()
            {
                lock (objlock)
                {
                    if (cpool == null)
                    {
                        cpool = new ConnectionPool();
                    }
                    return cpool;
                }
            }

           //获取池中的连接
            public MySqlConnection getConnection()
            {
                lock (pool)
                {
                    MySqlConnection tmp = null;
                    //可用连接数量大于0
                    if (pool.Count > 0)
                    {
                        //取第一个可用连接
                        tmp = (MySqlConnection)pool[0];
                        //在可用连接中移除此链接
                        pool.RemoveAt(0);
                        //不成功
                        if (!isUserful(tmp))
                        {
                            //可用的连接数据已去掉一个
                            useCount--;
                            tmp = getConnection();
                        }
                    }
                    else
                    {
                        //可使用的连接小于连接数量
                        if (useCount <= size)
                        {
                            try
                            {
                                //创建连接
                                tmp = CreateConnection(tmp);
                            }
                            catch (Exception e)
                            {
                            }
                        }
                    }
                    //连接为null
                    if (tmp == null)
                    {
                        //达到最大连接数递归调用获取连接否则创建新连接
                        if (useCount <= size)
                        {
                            tmp = getConnection();
                        }
                        else
                        {
                            tmp = CreateConnection(tmp);
                        }
                    }

                tmp.Open();
                    return tmp;
                }
            }


            //创建连接
            private MySqlConnection CreateConnection(MySqlConnection tmp)
            {
                //创建连接
                MySqlConnection conn = new MySqlConnection(ConnectionStr);
                //可用的连接数加上一个
                useCount++;
                tmp = conn;
                return tmp;
            }


            //关闭连接,将连接回到池中
            public void closeConnection(MySqlConnection con)
            {
            con.Close();
                lock (pool)
                {
                    if (con != null)
                    {
                        //将连接添加在连接池中
                        pool.Add(con);
                    }
                }
            }


            //目的保证所创连接成功,测试池中连接
            private bool isUserful(MySqlConnection con)
            {
                
                //主要用于不同用户
                bool result = true;
                if (con != null)
                {
                    string sql = "select 1";//随便执行对数据库操作
                con.Open();
                    MySqlCommand cmd = new MySqlCommand(sql, con);
                    try
                    {
                        cmd.ExecuteScalar().ToString();
                    }
                    catch
                    {
                        result = false;
                    con.Close();
                    }
                con.Close();
                }
                return result;
            }
        }

}

2.连接池的使用

MySqlConnection conn = null;
for (int i = 1; i <= 100000; ++i)
{
        //获取连接
        conn = ConnectionPool.getPool().getConnection();
        try
        {
             //数据操作
             MySqlCommand cmd = new MySqlCommand("Select * from zhy_testLianJie", conn);
             MySqlDataReader dr = cmd.ExecuteReader();
             while (dr.Read())
             {
                  Console.WriteLine("ID:" + i + ",姓名:" + dr[1]);
              }
              //将连接添加回连接池中
              ConnectionPool.getPool().closeConnection(conn);
        }
        catch (Exception ex)
        {
           Console.WriteLine("\n异常信息:\n{0}", ex.Message);
           break;
        }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值