创建一个连接池操作类

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 = * ; //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 > ) || ((DateTime.Now - u.time).TotalSeconds > * ) ||(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 > ) || ((DateTime.Now - u.time).TotalSeconds > * ) || (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 }
}

C# 基于创建一个mysql 连接池的更多相关文章

  1. JDBC创建mysql连接池代码

    1.底层实现类(DBConnection) package JDBC.JDBCPool.MyJDBCPool; import java.sql.Connection; import java.sql. ...

  2. Swoole4-swoole创建Mysql连接池

    一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机. 解决方案:连接池,这个连接池建立了200个和mysql的连接,这1000个 ...

  3. swoole4创建Mysql连接池

    一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机.   解决方案:连接池,这个连接池建立了200个和mysql的连接,这100 ...

  4. 实现一个协程版mysql连接池

    实现一个协程版的mysql连接池,该连接池支持自动创建最小连接数,自动检测mysql健康:基于swoole的chanel. 最近事情忙,心态也有点不积极.技术倒是没有落下,只是越来越不想写博客了.想到 ...

  5. nodejs + redis/mysql 连接池问题

    nodejs + redis/mysql 连接池问题 需不需要连接池 连接池的作用主要是较少每次临时建立连接所带来的开销.初步一看,nodejs运行单线程上,它不能同时使用多个连接,乍一看是不需要连接 ...

  6. MySQL连接池

    1. using System; using System.Collections; using MySql.Data.MySqlClient; namespace Helper { /// < ...

  7. python中实现mysql连接池

    python中实现mysql连接池 import pymysql from DBUtils.PooledDB import PooledDB MYSQL_HOST = 'localhost' USER ...

  8. workerman如何写mysql连接池

    首先要了解为什么用连接池,连接池能为你解决什么问题 连接池主要的作用1.减少与数据服务器建立TCP连接三次握手及连接关闭四次挥手的开销,从而降低客户端和mysql服务端的负载,缩短请求响应时间2.减少 ...

  9. Mysql 连接池

    数据库连接池的作用: 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接 ...

随机推荐

  1. c++计算1到100以内的质数

    自考c++实践的时候,有个求计算1-100的质数的问题,没搞出来 由于考试使用的是Dev-C++开发工具,为了下次考试做准备,改用该工具,直接下载安装即可,不会涉及到什么破解等 下载地址:https: ...

  2. 【Java】Java字符串转码

    最近在开发项目中,偶尔遇到从页面上传到后台的中文数据,老是出现乱码的情况,但是对这个转码的过程又记不住,故此在此备份一下,希望对朋友们也有所帮助: String title=request.getPa ...

  3. JAVA求解质因数

    /** * 求质因数 * @param n * @return */ public static List<Integer> generatePrimeFactors(int n){ Li ...

  4. vue 插槽 slot

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. linux,进行批量下载文件操作

     wget -i url.txt -P ./Photo 批量下载图片(一般是某个相册的图片) 首先先得到一张图片的地址如:www.example.com/pic/001.jpg 同相册的图片地址会有一 ...

  6. jsp EL运算符

    算术运算符 算术运算符 说明 示例 结果 + 加 ${1 + 1} 2 - 减 ${1 - 1} 0 * 乘 ${1 * 2} 2 /或div 除 ${3 / 2} 1.5 %或mod 取余 ${3 ...

  7. delphi 打印 PDevMode 说明

    //PDevMode = _devicemodeW;// _devicemodeW = record// dmDeviceName: array[0..CCHDEVICENAME - 1] of Wi ...

  8. Robot Framework:Excel操作

    robot framework 操作Excel需要安装库 ExcelLibrary pip install robotframework-ExcelLibrary 将ExcelLibrary 导入到r ...

  9. 阿里云文件存储(NAS)助力业务系统承载双十一尖峰流量

    2018天猫双11全球狂欢节,全天成交额再次刷新纪录达到2135亿元,其中总成交额在开场后仅仅用了2分05秒即突破100亿元,峰值的交易量达到惊人的高度,背后离不开阿里云大数据计算和存储能力的支撑.在 ...

  10. Oracle删除修改字段

    Oracle 增加修改删除字段 添加字段的语法:alter table tablename add (column datatype [default value][null/not null],…. ...