using Chloe;
using Chloe.Infrastructure;
using Chloe.SqlServer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Services
{
/// <summary>
/// 数据库连接管理类
/// </summary>
public class DBconnectionManagement
{ public DBconnectionManagement() {
aconnList = new List<DbObject>();
aLock = new object();
} private List<DbObject> aconnList { get; set; } /// <summary>
/// 获去一个新的连接
/// </summary>
/// <returns></returns>
private MyDbContext getNewconn()
{
return new MyDbContext("data source=119.29.21.XXX;initial catalog=XXX;user id=XX;password=XXX");
} /// <summary>
/// 新增一个连接到队列中
/// </summary>
private void Addconn() {
aconnList.Add(new DbObject(getNewconn()));
Console.WriteLine("新增了一个连接对象 目前" + aconnList.Count);
} int getCount = 0;
object aLock { get; set; }
/// <summary>
/// 获取一个连接对象
/// </summary>
public IDbContext Getconn()
{
Console.WriteLine("获取一次 第"+ ++getCount);
IDbContext result;
lock (aLock)
{
result = aconnList.Where(d => d.IsUse == false).Select(d => d.Conn).FirstOrDefault();
}
if (result == null)
{
Addconn();
return Getconn();
}
return result;
}
}
/// <summary>
/// 存放DB对象
/// </summary>
public class DbObject {
private DbObject() { } public DbObject(MyDbContext conn) {
conn.ABackOffFunc += BackOffFunc;
this.Conn = conn;
this.IsUse = false;
}
/// <summary>
/// 连接对象
/// </summary>
private MyDbContext conn { get; set; } /// <summary>
/// 连接对象
/// </summary>
public MyDbContext Conn { get { IsUse = true;return conn; } set { conn = value; } } /// <summary>
/// 是否真正被使用
/// </summary>
public bool IsUse { get; set; } /// <summary>
/// 销毁时候的回掉函数
/// </summary>
public Action<DbObject> AFuncComplete; private void BackOffFunc(MyDbContext conn) {
AFuncComplete?.Invoke(this);
IsUse = false;
} }
/// <summary>
/// 重写的连接对象
/// </summary>
public class MyDbContext : MsSqlContext, IDisposable { public MyDbContext(string connString):base(connString) { }
public MyDbContext(IDbConnectionFactory dbConnectionFactory) : base(dbConnectionFactory) { }
public new void Dispose()
{
ABackOffFunc.Invoke(this); }
/// <summary>
/// 真实销毁函数
/// </summary>
public void Close() {
//如果不执行此操作将会一直保持连接 可以使用定时器销毁对象
base.Dispose();
} /// <summary>
/// 销毁时候的回掉函数
/// </summary>
public Action<MyDbContext> ABackOffFunc;
}
}

  

使用chole创建一个连接池的更多相关文章

  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. Netbeans 中创建数据连接池和数据源步骤(及解决无法ping通问题)

    1.启动glassfish服务器, 在浏览器的地址栏中输入 http://localhost:4848 2.首先建立JDBC Connection Pools: 3.new 一个Connectio P ...

  5. [转]使用VC/MFC创建一个线程池

    许多应用程序创建的线程花费了大量时间在睡眠状态来等待事件的发生.还有一些线程进入睡眠状态后定期被唤醒以轮询工作方式来改变或者更新状态信息.线程池可以让你更有效地使用线程,它为你的应用程序提供一个由系统 ...

  6. Redis】Java中使用Jedis操作Redis(Maven导入包)、创建Redis连接池

    如果我们使用Java操作Redis, 需要确保已经安装了 redis 服务及 Java redis 驱动. Maven项目可以直接在pom.xml中加入jedis包驱动: <!-- https: ...

  7. Android 性能优化(16)线程优化:Creating a Manager for Multiple Threads 如何创建一个线程池管理类

    Creating a Manager for Multiple Threads 1.You should also read Processes and Threads The previous le ...

  8. ThreadPoolExecutor – Java Thread Pool Example(如何使用Executor框架创建一个线程池)

    Java thread pool manages the pool of worker threads, it contains a queue that keeps tasks waiting to ...

  9. 创建一个线程池(java)

    private ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("billService-poo ...

随机推荐

  1. C++中对C的扩展学习新增语法——作用域运算符::

    作用域运算符用来告诉编译器在哪个作用域范围搜索符号,一般分为以下3种: 全局作用域: 命名空间作用域: 类作用域:

  2. Mirantis 收购 Docker | 云原生生态周报 Vol. 28

    作者 | 禅鸣.进超.心水.心贵 业界要闻 Docker 将 Docker Enterprise 卖给 Mirantis Mirantis 是一家扎根于 OpenStack 的云公司,最近专注于 Ku ...

  3. 领扣(LeetCode)寻找旋转排序数组中的最小值 个人题解

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 请找出其中最小的元素. 你可以假设数组中不存在重 ...

  4. Mac的Safari安装油猴插件(Tampermonkey)

    Mac的Safari安装油猴插件(Tampermonkey) 官方的AppStore是没有油猴插件(Tampermonkey)的,官方插件不仅少,功能被阉割,相对弱小,还收费.嗯,这很苹果第三方拓展. ...

  5. ArrayList和LinkedList的源码学习,理解两者在插入、删除、和查找的性能差异

    List的使用 List的子类 1). ArrayList 数据结构:数组 2). Vector 数据结构:数组 3). LinkedList 数据结构:循环双向链表 ArrayList .Vecto ...

  6. 减少HTTP请求的方式

    1. 图片地图 缺点:坐标难定义:除了矩形之外几乎无法定义其他形状:通过DHTML(动态DOM操作)创建的图片地图在 IE 不兼容 <img usemap="#map1" b ...

  7. 🔥《手把手教你》系列基础篇之3-python+ selenium-驱动浏览器和元素定位大法(详细)

    1. 简介 上一篇中,只是简单地一带而过的说了一些驱动浏览器,这一篇继续说说驱动浏览器,然后再说一说元素定位的方法. 完成环境的安装并测试之后,我们对Selenium有了一定的了解了,接下来我们继续驱 ...

  8. Flex带Checkbox的Tree

    想把Flex自带的Tree控件改成带有checkbox的样式. 原本以为同DataGrid一样,添加一个ItemRenderer就行,结果发现行不通. 进Tree控件的源码看了一下,发现Tree在自己 ...

  9. 作业要求20191031-7 beta week 1/2 Scrum立会报告+燃尽图 05

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9915 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩 ...

  10. .NET高级特性-Emit(2.1)字段

    在上篇blog写完的几天后,有读者反映写的过于复杂,导致无法有效的进行实践:博主在考虑到园子里程序员水平高低不一致的情况,所以打算放慢脚步,对类的一些内容进行详细的讲解,顺带的会写一些笔者所遇到过的E ...