首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

資料庫連線池 Data Connection Framework 設計與實作

     編輯:關於.NET

架構概覽

具備 Connection Pooling 機制,管理不同 ADO.NET Connection。透過池物件工廠 PoolObjectFactory 建立連線池(參考:Singleton/SingleCall/Pool Object 模式)。

企業應用組件圖 類別圖

核心程式碼:ConnectionPoolContext

public sealed class ConnectionPoolContext : IDisposable {
    private PoolObjectFactory _factory;
    private string _defaultConnectionString;
    private string _factoryName;
    private Type _factoryType;
    private SqlStatementRepository _statementRepository;
    private static Dictionary<string, ConnectionPoolContext> _instances = new Dictionary<string, ConnectionPoolContext>();

    public string DefaultConnectionString { get; set; }
    public string FactoryName { get; set; }
    public SqlStatementRepository StatementRepository {
        get { return _statementRepository ?? (_statementRepository = new SqlStatementRepository()); }
    }
    internal PoolObjectFactory Factory { get; set; }

    public static ConnectionPoolContext Instance(string id) {
        return _instances[id];
    }

    public static void AddPool(string id, string factoryName, string connectionString, int max, bool limit) {
        var p = new ConnectionPoolContext();
        p._defaultConnectionString = connectionString;
        p._factoryName = factoryName;
        p.Factory = new PoolObjectFactory(max, limit, new ArrayList());
        _instances.Add(id, p);
    }

    public DbConnection AcquireConnection() {
        if (_factoryType == null) {
            var dbFactory = DbProviderFactories.GetFactory(_factoryName);
            var conn = dbFactory.CreateConnection();
            _factoryType = conn.GetType();
        }
        var connection = (DbConnection)Factory.AcquireObject(_factoryType);
        if (connection.ConnectionString == string.Empty)
            connection.ConnectionString = _defaultConnectionString;
        return connection;
    }

    public void ReleaseConnection(DbConnection conn) {
        Factory.ReleaseObject(conn);
        conn.Close();
    }

    public void Dispose() {
        if (_factory != null) ((IDisposable)_factory).Dispose();
    }

    private ConnectionPoolContext() { }
}

關鍵點:單例模式管理多連線池;DbProviderFactory 抽象廠建立連線;PoolObjectFactory 控制池大小與限制;取得連線時自動套用預設連線字串;釋放連線歸池並關閉;實作 IDisposable 正確清理資源。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved