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

匿名 (未验证) 提交于 2019-12-02 22:06:11

创建一个连接池操作类

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      } }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!