数据库连接池Data Connection Framework
数据库连接池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()
{
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?