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

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 正確清理資源。