使用chole创建一个连接池
阅读原文时间:2023年07月10日阅读:2

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
{
///

/// 数据库连接管理类 ///
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;  
}  

}