/// <summary> /// 在连接池中申请一个连接,线程安全 /// </summary> /// <param name="key">申请者</param> /// <param name="cl">申请的连接级别</param> /// <returns>返回申请到的连接</returns> public DbConnection GetConnectionFormPool(object key, ConnLevel cl) { lock (this) { if (_ps != PoolState.Run) { throw new StateException();//服务状态错误 } if (hs_UseConn.Count == MaxConnectionFormPool) { throw new PoolFullException();//连接池已经饱和,不能提供连接 } if (hs_UseConn.ContainsKey(key)) { throw new KeyExecption();//一个key对象只能申请一个连接 } if (cl == ConnLevel.ReadOnly) { return(GetConnectionFormPool_ReadOnly(key));//ReadOnly级别 } else if (cl == ConnLevel.High) { return(GetConnectionFormPool_High(key));//High级别 } else if (cl == ConnLevel.None) { return(GetConnectionFormPool_None(key));//None级别 } else { return(GetConnectionFormPool_Bottom(key));//Bottom级别 } } }
/// <summary> /// 返回DbConnection对象,同时做获得连接时的必要操作 /// </summary> /// <param name="key">key</param> /// <param name="cs">ConnStruct对象</param> /// <param name="cl">级别</param> /// <param name="readOnly">是否为只读属性</param> /// <returns></returns> private DbConnection GetConnectionFormPool_Return(object key, ConnStruct cs, ConnLevel cl) { try { if (cs == null) { throw new Exception(); } cs.Repeat(); hs_UseConn.Add(key, cs); if (cl == ConnLevel.ReadOnly) { cs.Allot = false; cs.IsRepeat = false; } } catch (Exception e) { throw new OccasionExecption();//连接资源耗尽,或错误的访问时机。 } finally { UpdateAttribute();//更新属性 } return(cs.Connection); }
/// <summary> /// 在连接池中申请一个连接,线程安全 /// </summary> /// <param name="key">申请者</param> /// <param name="cl">申请的连接级别</param> /// <returns>返回申请到的连接</returns> public DbConnection GetConnectionFormPool(object key, ConnLevel cl) { lock (this) { if (_ps != PoolState.Run) { throw new StateException();//服务状态错误 } if (hs_UseConn.ContainsKey(key)) { //throw new KeyExecption();//一个key对象只能申请一个连接 ConnStruct cs = (ConnStruct)hs_UseConn[key]; cs.LastRunTime = DateTime.Now; if (cs.State == ConnectionState.Open) { return(cs.Connection); } else { hs_UseConn.Remove(key); return(GetConnectionFormPool_High(key));//High级别 } } if (hs_UseConn.Count == MaxConnectionFormPool) { throw new PoolFullException();//连接池已经饱和,不能提供连接 } if (cl == ConnLevel.ReadOnly) { return(GetConnectionFormPool_ReadOnly(key));//ReadOnly级别 } else if (cl == ConnLevel.High) { return(GetConnectionFormPool_High(key));//High级别 } else if (cl == ConnLevel.None) { return(GetConnectionFormPool_None(key));//None级别 } else { return(GetConnectionFormPool_Bottom(key));//Bottom级别 } } }