數據庫連接池Data Connection Framework具備Connection pooling機制,能管理不同的ADO.net Connection。並通過池對象工廠去PoolObjectFactory去創建數據連接池。(可參考:對象工廠創建--- Singleton Object,SingleCall Object,Pool Object )
連接池企業應用組件圖如下:
類圖如下:
主要文件代碼:
/// <summary> /// 連接池上下文 /// </summary> public sealed class ConnectionPoolContext : IDisposable { /// <summary> /// 池對象工廠 /// </summary> private PoolObjectFactory _factory; /// <summary> /// 默認連接字符 /// </summary> private string _defaultConnectionString; /// <summary> /// 工廠名稱 /// </summary> private string _factoryName; /// <summary> /// 類型 /// </summary> private Type _factoryType; /// <summary> /// SQL狀態倉庫 /// </summary> private SqlStatementRepository _statementRepository; /// <summary> /// 連接池 /// </summary> private static Dictionary<string, ConnectionPoolContext> _instances = new Dictionary<string, ConnectionPoolContext>(); /// <summary> /// 默認連接字符屬性 /// </summary> public string DefaultConnectionString { get { return _defaultConnectionString; } set { _defaultConnectionString = value; } } /// <summary> /// 工廠名 /// </summary> public string FactoryName { get { return _factoryName; } set { _factoryName = value; } } /// <summary> /// SQL狀態倉庫屬性 /// </summary> public SqlStatementRepository StatementRepository { get { if (_statementRepository == null) _statementRepository = new SqlStatementRepository(); return _statementRepository; } } /// <summary> /// 對象工廠模式 /// </summary> internal PoolObjectFactory Factory { get { return _factory; } set { _factory = value; } } /// <summary> /// 實例化一個連接池 /// </summary> /// <param name="id"></param> /// <returns></returns> public static ConnectionPoolContext Instance(string id) { return _instances[id]; } /// <summary> /// 添加一個連接到池中 /// </summary> /// <param name="id">id</param> /// <param name="factoryName">工廠名稱</param> /// <param name="connectionString">連接字符串</param> /// <param name="max">最大數</param> /// <param name="limit">是否限制</param> public static void AddPool(string id, string factoryName, string connectionString, int max, bool limit) { ConnectionPoolContext p = new ConnectionPoolContext(); p._defaultConnectionString = connectionString; p._factoryName = factoryName; p.Factory = new PoolObjectFactory(max, limit, new ArrayList()); _instances.Add(id, p); } /// <summary> /// 得到一個連接 /// </summary> /// <returns>數據庫連接</returns> public DbConnection AcquireConnection() { if (_factoryType == null) { DbProviderFactory dbFactory = DbProviderFactories.GetFactory (_factoryName); DbConnection conn = dbFactory.CreateConnection(); _factoryType = conn.GetType(); } DbConnection connection = (DbConnection)Factory.AcquireObject (_factoryType); if (connection.ConnectionString == string.Empty) connection.ConnectionString = _defaultConnectionString; return connection; } /// <summary> /// 釋放一個連接 /// </summary> /// <param name="conn">數據庫連接</param> public void ReleaseConnection(DbConnection conn) { Factory.ReleaseObject(conn); conn.Close(); } #region IDisposable Members /// <summary> /// 釋放連接 /// </summary> public void Dispose() { if (_factory != null) ((IDisposable)_factory).Dispose(); } #endregion /// <summary> /// 私有構造函數 /// </summary> private ConnectionPoolContext() { } }