C# 基于创建一个mysql 连接池


创建一个连接池操作类

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;

namespace CommonAssistant
{

    public class MySqlConnectionPool
    {
        private readonly string sqlConnect = string.Empty;
        public MySqlConnectionPool(string Connection)
        {
            sqlConnect = Connection;

            //定时器轮询连接,清理不在使用的连接
            var timer = new Timer();
            timer.Enabled = true;
            timer.Elapsed += (a, b) =>
            {
                //轮询连接池连接,删除满足条件的连接
                 delwithConnectPool("remove");
                Console.WriteLine( "连接数:"+getCount());

            };
            timer.Interval =   1000 * 10; //10分钟一次
            timer.AutoReset = true;//一直执行
        }

        private static List<ConnectionItem> listConnects = new List<ConnectionItem>();


        private static readonly object obj_getConnects = new object();
        public Tuple<bool, ConnectionItem> delwithConnectPool(string type)
        {
            //保证并发条件下集合增删改查时的数据唯一性
            lock (obj_getConnects)
            {
                bool result = false;
                ConnectionItem result_item = null;
                switch (type)
                {
                    case "get":
                        var connectItem = listConnects.Where(u => u.ifBusy == false).FirstOrDefault();

                        if (connectItem == null)
                        {
                            listConnects.Add(result_item = getInstance(sqlConnect));
                        }
                        else {
                            if (connectItem.mySqlConn.State == System.Data.ConnectionState.Open)
                            {
                                connectItem.setBusy(true);
                                connectItem.updateTime(DateTime.Now);
                                result_item = connectItem;
                            }
                            else {
                                listConnects.Add(result_item = getInstance(sqlConnect));
                            }
                        }
                        
                        break;
                    case "remove":
                        if (listConnects != null && listConnects.Any())
                        {
                            //删除移除 超过10分钟未使用的的连接,使用两分钟的未释放连接,连接状态已关闭的连接
                            var listOuteTimes = listConnects.Where(u => (u.ifBusy == true && (DateTime.Now - u.time).TotalSeconds > 120) || ((DateTime.Now - u.time).TotalSeconds > 60 * 10) ||(u.mySqlConn.State != System.Data.ConnectionState.Open) );
                            foreach (var item in listOuteTimes)
                            {
                                item.mySqlConn.Close();
                                item.mySqlConn.Dispose();//释放 
                            }
                            //超时连接移除
                            listConnects.RemoveAll(u => (u.ifBusy == true && (DateTime.Now - u.time).TotalSeconds > 120) || ((DateTime.Now - u.time).TotalSeconds > 60 * 10) || (u.mySqlConn.State != System.Data.ConnectionState.Open));
                        }
                        break;
                }
                return new Tuple<bool, ConnectionItem>(result, result_item);
            }

        }


        public ConnectionItem getInstance(string connect)
        {

            var item = new ConnectionItem()
            {

                ifBusy = true,
                time = DateTime.Now,
                mySqlConn = new MySqlConnection(connect)
            };
            item.mySqlConn.Open();
            return item;


        }


        //获取一个空闲连接
        public ConnectionItem getFreeConnectItem()
        {
            return delwithConnectPool("get").Item2;
        }

        public int getCount() {
            return listConnects.Count;
        }

    }



    public class ConnectionItem : IDisposable
    {
        public DateTime time { get; set; }

        public MySqlConnection mySqlConn { get; set; }

        public bool ifBusy { get; set; }//设置是否在使用
        public void setBusy(bool busy)
        {
            ifBusy = busy;
        }

        public void updateTime(DateTime dt)
        {
            time = dt;
        }

        public void Dispose()
        {
            ifBusy = false;
        }
    }
}

 

基于不同的mysql数据库,使用不同连接池

using System;
using System.Collections.Generic;
using System.Text;

namespace CommonAssistant
{
    public class WorkDbConnectManage
    {
        #region 连接池(1)
        private static  MySqlConnectionPool tempPool_A = null;
        private static readonly string dbConnect_A = "Database=ywthgoods;Data Source=localhost;Port=3306;UserId=root;Password=123456;Charset=utf8;TreatTinyAsBoolean=false;Allow User Variables=True";



        private static readonly object readPoolA = new object();
        public static MySqlConnectionPool getTempPool_A()
        {
            //双if加锁,有且只创建一个连接池
            if (tempPool_A == null)
            {
                lock (readPoolA)
                {
                    if (tempPool_A == null)
                    {
                        tempPool_A = new MySqlConnectionPool(dbConnect_A);
                    }
                }
            }
            return tempPool_A;
        }



        public static ConnectionItem getWork1Conn_A()
        {
            return getTempPool_A().getFreeConnectItem();

        }
        #endregion

        #region 连接池(2)
        private static MySqlConnectionPool tempPool_B = null;
        private static readonly string dbConnect_B = "";



        private static readonly object readPoolB_lock = new object();
        public static MySqlConnectionPool getTempPool_B()
        {
            //双if加锁,有且只创建一个连接池
            if (tempPool_B == null)
            {
                lock (readPoolB_lock)
                {
                    if (tempPool_A == null)
                    {
                        tempPool_A = new MySqlConnectionPool(dbConnect_B);
                    }
                }
            }
            return tempPool_A;
        }



        public static ConnectionItem getWork1Conn_B()
        {
            return getTempPool_B().getFreeConnectItem();

        }
        #endregion

    }
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM