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. [Xilinx笔记] 《FPGA伴你玩转USB3.0与LVDS》 读书笔记

    2019年10月15日09:31:10 第一部分·哪些要看(优先级由高到低) 0.8.1   LVDS数据收发实例 8.2   带CRC校验的LVDS数据收发实例 1.3.6   USB3.0 控制器 ...

  2. 通过myclipse建立一个简单的Hibernate项目(PS:在单元测试中实现数据的向表的插入)

    Hibernate的主要功能及用法: Ⅰ.Hibernate封装了JDBC,使Java程序员能够以面向对象的思想对数据库进行操作 Ⅱ.Hibernate可以应用于EJB的J2EE架构,完成数据的持久化 ...

  3. hdu 1087 Super Jumping! Jumping! Jumping!(动态规划DP)

    Super Jumping! Jumping! Jumping!Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  4. volatile变量能保证线程安全性吗?为什么?

    在谈及线程安全时,常会说到一个变量——volatile.在<Java并发编程实战>一书中是这么定义volatile的——Java语言提供了一种稍弱的同步机制,即volatile变量,用来确 ...

  5. 力扣(LeetCode)4的幂 个人题解

    给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方. 示例 1: 输入: 16 输出: true 示例 2: 输入: 5 输出: false 进阶:你能不使用循环或者递归 ...

  6. opencv 3 core组件进阶(2 ROI区域图像叠加&图像混合;分离颜色通道、多通道图像混合;图像对比度,亮度值调整)

    ROI区域图像叠加&图像混合 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp&g ...

  7. 搭建wordPress遇到无法连接数据库的问题

    在确认了数据库用户,密码,地址都没有错的情况下,仍然出现无法连接数据库的问题,以至无法安装wordpress 我的wordpress:4.8.1-zh_CN 解决办法: 1.更改php的版本(我的改为 ...

  8. 2019-9-25:渗透测试,基础学习,Hydra BP爆破,js基本知识,banner信息收集笔记

    使用BP和Hydra爆破相关的服务hydra:九头蛇,开源的功能强大的爆破工具,支持的服务有很多,使用hydra爆破c/s结构的服务,使用bp爆破web登陆窗口爆破需要的几个条件,爆破工具+字典字典: ...

  9. 解决WebUploader 上传按钮按F12 才行的问题

    遇到了 WebUploader 插件的上传按钮点击无效(此时鼠标在按钮任何位置时,按钮都没变化).按F12 之后才有反应(此时鼠标在按钮任何位置时,按钮颜色都会变深) 的问题,网上查到一些答案,找到了 ...

  10. 影响ES相关度算分的因素

    相关性算分 指文档与查询语句间的相关度,通过倒排索引可以获取与查询语句相匹配的文档列表   如何将最符合用户查询需求的文档放到前列呢? 本质问题是一个排序的问题,排序的依据是相关性算分,确定倒排索引哪 ...