当前位置: 首页 > news >正文

c#OleDb连接池管理功能

使用 ConcurrentDictionary 和 ConcurrentBag 来管理数据库连接

using Drv.Utilities;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data.OleDb;
using System.Linq;namespace Drv.AccessClient
{/// <summary>/// 连接池管理类/// </summary>public class MultipleConnectionPool{private ConcurrentDictionary<string, ConcurrentBag<PooledOleDbConnection>> _connectionPools;private int _maxConnectionCount;private Logger _logger;public MultipleConnectionPool(int maxConnectionCount = 5){_connectionPools = new ConcurrentDictionary<string, ConcurrentBag<PooledOleDbConnection>>();_logger = new Logger();_maxConnectionCount = maxConnectionCount;}/// <summary>/// 获取连接/// </summary>/// <param name="connectionString"></param>/// <returns></returns>public PooledOleDbConnection GetConnection(string connectionString){if (!_connectionPools.ContainsKey(connectionString)){_connectionPools[connectionString] = new ConcurrentBag<PooledOleDbConnection>();}var pool = _connectionPools[connectionString];PooledOleDbConnection availableConnection = null;// 先找已有可用连接foreach (var connection in pool){if (!connection.IsBusy && IsConnectionValid(connection.Connection)){connection.IsBusy = true;availableConnection = connection;break;}}// 没有可用连接,且连接数量小于最大连接数,则创建新连接if (availableConnection == null && pool.Count < _maxConnectionCount){try{var newConnection = new OleDbConnection(connectionString);newConnection.Open();var pooledConnection = new PooledOleDbConnection(newConnection, connectionString);pooledConnection.IsBusy = true;pool.Add(pooledConnection);availableConnection = pooledConnection;}catch (Exception ex){_logger.LogError($"创建数据库连接失败: {ex.Message}");}}else if (availableConnection == null){_logger.LogError("达到最大连接数,无法获取新的连接");}return availableConnection;}/// <summary>/// 释放连接/// </summary>/// <param name="connection"></param>public void ReleaseConnection(PooledOleDbConnection connection){if (connection != null){connection.IsBusy = false;// 可选择在连接不再使用时关闭连接// connection.Connection.Close(); // 视具体需要而定}}// 检查连接是否有效private bool IsConnectionValid(OleDbConnection connection){try{if (connection.State == System.Data.ConnectionState.Open){// 这里可以执行一个简单的查询来验证连接// connection.CreateCommand().CommandText = "SELECT 1";// connection.CreateCommand().ExecuteScalar();return true;}}catch (Exception ex){_logger.LogError($"连接无效: {ex.Message}");}return false;}}public class PooledOleDbConnection{public OleDbConnection Connection { get; }public string ConnectionString { get; }public bool IsBusy { get; set; }public PooledOleDbConnection(OleDbConnection connection, string connectionString){Connection = connection;ConnectionString = connectionString;IsBusy = false;}}
}
using Drv.Utilities;
using System;
using System.Data;
using System.Data.OleDb;namespace Drv.AccessClient
{public class SimpleDbConnectionManager : IDisposable{private OleDbConnection _connection;private string _connectionString;private bool _disposed = false; // 用于标识是否已释放资源private Logger _logger;public SimpleDbConnectionManager(string connectionString){if (string.IsNullOrWhiteSpace(connectionString)){_logger.LogError("连接字符串不能为空");}_connectionString = connectionString;_connection = new OleDbConnection(_connectionString);_logger = new Logger();}public void OpenConnection(){if (_connection.State != ConnectionState.Open){_connection.Open();}}public void CloseConnection(){if (_connection.State != ConnectionState.Closed){_connection.Close();}}public DataTable ExecuteQuery(string sql){OpenConnection();DataTable dataTable = new DataTable();try{using (OleDbCommand command = new OleDbCommand(sql, _connection)){using (OleDbDataAdapter adapter = new OleDbDataAdapter(command)){adapter.Fill(dataTable);}}}catch (Exception ex){_logger.LogError($"执行查询时发生错误: {ex.Message}\n{ex.StackTrace}");throw;}finally{CloseConnection();}return dataTable;}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}protected virtual void Dispose(bool disposing){if (!_disposed){if (disposing){CloseConnection();_connection?.Dispose();}_disposed = true;}}~SimpleDbConnectionManager(){Dispose(false); // 确保析构时也能释放资源}}
}

相关文章:

  • C# 中参数前加 this 关键字
  • 【scikit-learn基础】--『监督学习』之 贝叶斯分类
  • 高速电路中的电感、磁珠的选型及应用
  • 浏览器崩溃问题处理方案
  • Deeplizard 深度学习课程(一)—— Pytorch 和 Tensor 简介
  • iotdb时序数据库使用
  • Go:测试
  • 强化学习的数学原理(十)actor-critic 方法
  • 接口测试(get请求方法)-----------实战演练
  • 得物golang一面
  • 在 Visual Studio Code 中安装通义灵码 - 智能编码助手
  • 【网络安全】谁入侵了我的调制解调器?(二)
  • NLP高频面试题(四十四)——RLHF过程中的马尔科夫决策过程及对话场景MDP设计
  • 【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——音频测试 #ES8388 #录音测试
  • AI Agent分类详解与对比
  • 力扣刷题Day 18:字符串解码(394)
  • 码界奇缘 Java 觉醒 后记 第二十五章 安全结界攻防战 - 从沙箱到模块化
  • 【SpringBoot】99、SpringBoot中整合RabbitMQ实现重试功能
  • 小白工具视频转wmv,支持多种格式视频在线转换为 WMV 格式,无需下载在线使用,方便快捷
  • 基于javaweb的SpringBoot兼职平台系统设计与实现(源码+文档+部署讲解)
  • 网站制作的动画怎么做的/杭州搜索引擎推广排名技术
  • 江门企业免费建站/小程序定制开发公司
  • 学校网站 建设措施/高端网站建设深圳
  • 典型的网站案例/营销活动推广策划
  • 使用万网怎么做网站/广州竞价托管代运营
  • 高州做网站/常州seo排名收费