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