创建一个连接池操作类

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. Qt5.2中使用ping命令实现Ip扫描功能

    在实现类似于Free IP Scanner 2.1的Ip扫描器软件中,会用到ping命令.如果使用Qt编程实现,主要会用QThread.QProcess这两个类.关于这两个类的具体用法可以查阅Qt助手 ...

  2. 使用pip 时报错 Fatal error in launcher: Unable to create process using '"D:\pytghon2.7\python.exe" "D:\python2.7\S

    无法创建使用pip.exe创建进程,说白了就是无法启动pip安装插件. 解决方法升级pip: python -m pip install -U pip  

  3. vim的基本快捷操作(二)——可视模式

    va{ 选中{}中间内容,包括{} va[ 选中[]中间内容,包括{} va( 选中()中间内容 ,包括{} vi< 选中<>中间内容,包括<> 将上面的a换成i,就不包 ...

  4. LeetCode Array Easy 66. Plus One

    Description Given a non-empty array of digits representing a non-negative integer, plus one to the i ...

  5. 2018-8-10-win10-uwp-dataGrid

    title author date CreateTime categories win10 uwp dataGrid lindexi 2018-08-10 19:16:51 +0800 2018-2- ...

  6. 在Kubernetes下部署Prometheus

    使用ConfigMaps管理应用配置 当使用Deployment管理和部署应用程序时,用户可以方便了对应用进行扩容或者缩容,从而产生多个Pod实例.为了 能够统一管理这些Pod的配置信息,在Kuber ...

  7. Nginx---配置系统(自己总结)

    1.Nginx配置系统 Nginx的配置系统   由  一个主配置文件  和  其他一些辅助的配置文件  构成: 这些文件均为纯文本文件,全部位于nginx安装目录下的conf目录下: Nginx配置 ...

  8. Java IO之处理流

    一.处理流: 增强功能,提供性能,在节点流之上. 二.节点流与处理流的关系 节点流(字节流.字符流)处于IO操作的第一线,所有操作必须通过它们进行: 处理流可以对其他流进行处理(提高效率或操作灵活性) ...

  9. web框架express学习一

    服务端 node app.jsapp.jslet express = require("express"); let http = require("http" ...

  10. JMeter生成性能报表-Windows环境和Linux环境

    转载自https://www.cnblogs.com/imyalost/p/10239317.html