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 = * ; //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 连接池的更多相关文章
- JDBC创建mysql连接池代码
1.底层实现类(DBConnection) package JDBC.JDBCPool.MyJDBCPool; import java.sql.Connection; import java.sql. ...
- Swoole4-swoole创建Mysql连接池
一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机. 解决方案:连接池,这个连接池建立了200个和mysql的连接,这1000个 ...
- swoole4创建Mysql连接池
一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机. 解决方案:连接池,这个连接池建立了200个和mysql的连接,这100 ...
- 实现一个协程版mysql连接池
实现一个协程版的mysql连接池,该连接池支持自动创建最小连接数,自动检测mysql健康:基于swoole的chanel. 最近事情忙,心态也有点不积极.技术倒是没有落下,只是越来越不想写博客了.想到 ...
- nodejs + redis/mysql 连接池问题
nodejs + redis/mysql 连接池问题 需不需要连接池 连接池的作用主要是较少每次临时建立连接所带来的开销.初步一看,nodejs运行单线程上,它不能同时使用多个连接,乍一看是不需要连接 ...
- MySQL连接池
1. using System; using System.Collections; using MySql.Data.MySqlClient; namespace Helper { /// < ...
- python中实现mysql连接池
python中实现mysql连接池 import pymysql from DBUtils.PooledDB import PooledDB MYSQL_HOST = 'localhost' USER ...
- workerman如何写mysql连接池
首先要了解为什么用连接池,连接池能为你解决什么问题 连接池主要的作用1.减少与数据服务器建立TCP连接三次握手及连接关闭四次挥手的开销,从而降低客户端和mysql服务端的负载,缩短请求响应时间2.减少 ...
- Mysql 连接池
数据库连接池的作用: 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接 ...
随机推荐
- gitlab+gitlab-ci+docker自动化部署
导言 本次测试用的是gitlab-ci,单纯与gitlab搭配而言,gitlab-ci较jenkins更加一体,顺畅. 主机1:192.168.100.151 gitlab 主机2:192.168.1 ...
- 分布式ID生成器的解决方案总结
在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等.那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十分重要 ...
- 【Movie】绿皮书
今天和室友一起去看了<绿皮书>,一部获得奥斯卡的电影. 起初我是没什么太大期望的,纯粹是因为特价票10块钱,加上身边一个小姐姐的力荐. 看完我觉得,啊不愧是奥斯卡电影啊.推荐. 以下可能会 ...
- iView的表单table
// html<div class="exam-list"> <Table :columns="columns7" :data="d ...
- 利用HTML和CSS实现常见的布局
水平居中的页面布局中最为常见的一种布局形式,多出现于标题,以及内容区域的组织形式,下面介绍四种实现水平居中的方法(注:下面各个实例中实现的是child元素的对齐操作,child元素的父容器是paren ...
- termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed - 获取和设置终端属性,行控制,获取和设置波特率
SYNOPSIS 总览 #include <termios.h> #include <unistd.h> int tcgetattr(int fd, struct termio ...
- Red Hat 操作系统 rpm 卸载软件提示"error: %preun( ) scriptlet failed, exit status 1"
在linux里安装程序有两种方法,一种是源程序安装,按照安装包里的readme或者install文件指示,一步步地进行,通常是configure, make, install三部曲.另一种就是rpm包 ...
- Hession实现远程通讯(基于Binary-RPC协议)
一.开发工具 1.jdk1.6 64位 百度网盘地址:https://pan.baidu.com/s/1Zwqfmi20X4ANNswZzPMzXQ 提取码:k50r 2.apache-maven-3 ...
- .net Mvc Dapper 方法封装
首先需要添加 NuGet 包 Dapper 以及引用Configuration <connectionStrings> <add name="SqlSrc&quo ...
- 使用Vue和djangoframwork完成登录页面构建 001
使用Vue和djangoframwork完成登录页面构建 001 环境的搭建 首先,我在我的电脑的F盘创建了一个文件夹 forNote,进入到这个文件夹中 F:\forNote> vue环境的搭 ...