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. nyoj 170-网络的可靠性 (度为1)

    170-网络的可靠性 内存限制:64MB 时间限制:3000ms 特判: No 通过数:15 提交数:21 难度:3 题目描述: A公司是全球依靠的互联网解决方案提供商,也是2010年世博会的高级赞助 ...

  2. 力扣(LeetCode)Excel表列名称 个人题解

    给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> ...

  3. SecureCRT 多个会话显示在同一窗口

  4. Extjs导入Excel文件之后grid自动刷新显示刚插入的数据

    var winUpload = new Ext.Window({ title: '导入excel文件', width: 400, height:200, listeners: { close: fun ...

  5. drf序列化组件之视图家族

    一.视图家族的分类 1.导入分类 from rest_framewok import views, generics, mixins, viewsets views:视图类 ​ 两大视图类:APIVi ...

  6. 24 道 shell 脚本面试题

    想要成为中高级phper, shell 脚本是需要掌握的,它有助于你在工作环境中自动完成很多任务. 如下是一些面试过程中,经常会遇到的 shell 脚本面试问题及解答: Q:1 Shell脚本是什么. ...

  7. python容器类型列表的操作

    列表:使用中括号进行表示元素的集合,元素与元素之间使用逗号隔开:列表中的元素可以存放不同的数据类型,但是通常存放相同的数据类型: 1.列表的声明: # 声明一个列表:变量名 = [元素1,元素2] l ...

  8. JavaScript笔记九

    1.数组方法 reverse() - 可以用来反转一个数组,它会对原数组产生影响 concat() - 可以连接两个或多个数组,它不会影响原数组,而是新数组作为返回值返回 join() - 可以将一个 ...

  9. es3设置属性不能修改

    /*es3*/ { var Person =function () { var data ={ name:'zs', sex:'男', age:18 } this.get=function (key) ...

  10. python数据分析三个重要方法之:numpy和pandas

    关于数据分析的组件之一:numpy ndarray的属性     4个必记参数:ndim:维度shape:形状(各维度的长度)size:总长度dtype:元素类型   一:np.array()产生n维 ...