using System; using System.Collections; using System.Text; using System.Data; using System.Data.Common; namespace DateBaseConnectionPool { /// /// 连接池状态 /// public enum PoolState { /// /// 刚刚创建的对象,表示该对象未被调用过StartSeivice方法。 /// UnInitialize, /// /// 初始化中,该状态下服务正在按照参数初始化连接池。 /// Initialize, /// /// 运行中 /// Run, /// /// 停止状态 /// Stop } /// /// 要申请连接的级别 /// public enum ConnLevel { /// /// 独占方式,分配全新的连接资源,并且该连接资源在本次使用释放回连接池之前不能在分配出去。如果连接池只能分配引用记数类型连接资源则该级别将产生一个异常,标志连接池资源耗尽 /// ReadOnly, /// /// 优先级-高,分配全新的连接资源,不使用引用记数技术。注:此级别不保证在分配后该连接资源后,仍然保持独立占有资源,若想独立占有资源请使用ReadOnely /// High, /// /// 优先级-中,适当应用引用记数技术分配连接 /// None, /// /// 优先级-底,尽可能使用引用记数技术分配连接 /// Bottom } /// /// 连接类型 /// public enum ConnTypeEnum { /// /// ODBC 数据源 /// Odbc, /// /// OLE DB 数据源 /// OleDb, /// /// SqlServer 数据库连接 /// SqlClient, /// /// 默认(无分配) /// None } /// /// 连接池中的一个连接类型 /// public class ConnStruct : IDisposable { /// /// 连接池中的连接 /// /// 数据库连接 /// 连接类型 public ConnStruct(DbConnection dbc, ConnTypeEnum cte) { createTime = DateTime.Now; connect = dbc; connType = cte; } /// /// 连接池中的连接 /// /// 连接创建时间 /// 数据库连接 /// 连接类型 public ConnStruct(DbConnection dbc, ConnTypeEnum cte, DateTime dt) { createTime = dt; connect = dbc; connType = cte; } //-------------------------------------------------------------------- private bool enable = true;//是否失效 private bool use = false;//是否正在被使用中 private bool allot = true;//表示该连接是否可以被分配 private DateTime createTime = DateTime.Now;//创建时间 private int useDegree = 0;//被使用次数 private int repeatNow = 0;//当前连接被重复引用多少 private bool isRepeat = true;//连接是否可以被重复引用,当被分配出去的连接可能使用事务时,该属性被标识为true private ConnTypeEnum connType = ConnTypeEnum.None;//连接类型 private DbConnection connect = null;//连接对象 private object obj = null;//连接附带的信息 #region 属性部分 /// /// 表示该连接是否可以被分配 /// public bool Allot { get { return allot; } set { allot = value; } } /// /// 是否失效;false表示失效,只读 /// public bool Enable { get { return enable; } } /// /// 是否正在被使用中,只读 /// public bool IsUse { get { return use; } } /// /// 创建时间,只读 /// public DateTime CreateTime { get { return createTime; } } /// /// 被使用次数,只读 /// public int UseDegree { get { return useDegree; } } /// /// 当前连接被重复引用多少,只读 /// public int RepeatNow { get { return repeatNow; } } /// /// 得到数据库连接状态,只读 /// public ConnectionState State { get { return connect.State; } } /// /// 得到该连接,只读 /// public DbConnection Connection { get { return connect; } } /// /// 连接是否可以被重复引用 /// public bool IsRepeat { get { return isRepeat; } set { isRepeat = value; } } /// /// 连接类型,只读 /// public ConnTypeEnum ConnType { get { return connType; } } /// /// 连接附带的信息 /// public object Obj { get { return obj; } set { obj = value; } } #endregion /// /// 打开数据库连接 /// public void Open() { connect.Open(); } /// /// 关闭数据库连接 /// public void Close() { connect.Close(); } /// /// 无条件将连接设置为失效 /// public void SetConnectionLost() { enable = false; allot = false; } /// /// 被分配出去,线程安全的 /// public void Repeat() { lock (this) { if (enable == false)//连接可用 throw new ResLostnExecption();//连接资源已经失效 if (allot == false)//是否可以被分配 throw new AllotExecption();//连接资源不可以被分配 if (use == true && isRepeat == false) throw new AllotAndRepeatExecption();//连接资源已经被分配并且不允许重复引用 repeatNow++;//引用记数+1 useDegree++;//被使用次数+1 use = true;//被使用 } } /// /// 被释放回来,线程安全的 /// public void Remove() { lock (this) { if (enable == false)//连接可用 throw new ResLostnExecption();//连接资源已经失效 if (repeatNow == 0) throw new RepeatIsZeroExecption();//引用记数已经为0 repeatNow--;//引用记数-1 if (repeatNow == 0) use = false;//未使用 else use = true;//使用中 } } /// /// 释放资源 /// public void Dispose() { enable = false; connect.Close(); connect = null; } } }