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); // 确保析构时也能释放资源}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Flink运行时架构】核心组件

在Flink的运行架构中&#xff0c;有两大比较重要的组件&#xff1a;作业管理器&#xff08;JobManager&#xff09;和任务管理器&#xff08;TaskManager&#xff09;。 Flink的作业提交与任务处理时的系统如下图所示。 其中&#xff0c;客户端并不是处理系统的一部分&#xff…

牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记2

目录 一、ArcGIS Engine概述 1、 定义 2、 核心功能 3、 与ArcObjects&#xff08;AO&#xff09;的关系 二、开发环境搭建 1、 开发工具要求 2、 关键步骤 三、 ArcGIS Engine核心组件 1、 对象模型 2、 类库分类 四、 第一个AE应用程序&#xff08;C#示例&#xf…

端、管、云一体化原生安全架构 告别外挂式防护!

面对数字化转型浪潮&#xff0c;企业网络安全风险日益凸显。数据泄露、黑客勒索等事件频发&#xff0c;合规要求加速推进。尽管企业纷纷部署了防病毒、身份认证、文件加密、入侵防护、流量监控等多种安全系统&#xff0c;但分散且孤立的架构非但没有有效抵御风险&#xff0c;反…

深度学习--深度学习概念、框架以及构造

文章目录 一、深度学习1.什么是深度学习&#xff1f;2.特点3.神经网络构造1&#xff09;.单层神经元2&#xff09;多层神经网络3&#xff09;小结 4.感知器5.多层感知器6.多层感知器&#xff08;偏置节点&#xff09;7.神经网络构造 一、深度学习 1.什么是深度学习&#xff1f…

helm账号密码加密

1、安装工具 sudo apt update sudo apt install gnupg -y wget https://github.com/getsops/sops/releases/download/v3.10.2/sops-v3.10.2.linux.amd64 mv sops-v3.10.2.linux.amd64 /usr/local/bin/sops chmod x /usr/local/bin/sops2、生成加密文件 gpg --full-generate-…

大数据面试问答-HBase/ClickHouse

1. HBase 1.1 概念 HBase是构建在Hadoop HDFS之上的分布式NoSQL数据库&#xff0c;采用列式存储模型&#xff0c;支持海量数据的实时读写和随机访问。适用于高吞吐、低延迟的场景&#xff0c;如实时日志处理、在线交易等。 RowKey&#xff08;行键&#xff09; 定义&#xf…

动态渲染组件

React框架&#xff0c;JSX语法 今天遇到一个好玩的 常规的搜索列表&#xff0c;列表最后一列为操作列&#xff0c;删改查。 眼看着Table 操作列 的配置文件越来越复杂&#xff0c;决定把操作列单独写一个组件&#xff0c;代码瞬间靓仔了些 {title: Operation,dataIndex: oper…

Web APIs阶段

一、Web APIs和JS基础关联性 1.1JS的组成 1.2JS基础阶段以及Web APIs阶段 JS基础阶段&#xff1a;学习的是ECMAScript标准规定的基础语法 Web APIs阶段&#xff1a; Web APIs是W3C组织的标准Web APIs我们主要学习DOM和BOMWeb APIs是JS独有的部分主要学习页面交互功能需要使用…

Doip功能寻址走UDP协议

目前使用 connect()函数的UDP客户端 ,这里接收数据 解析的地方 查看一下。 如果使用 bind()、sendto()、recvfrom() 组合 那么返回值 和发送要在做调整&#xff0c;&#xff0c;根据业务需要后续在调整 其余的 和原来的 逻辑都是一样的&#xff0c;只是协议变了而已。 if serv…

Linux指令的详细介绍

前言&#xff1a;&#x1f33c;&#x1f33c; Linux是一款强大且广泛使用的操作系统&#xff0c;命令行接口&#xff08;CLI&#xff09;是与其交互的核心方式。通过Linux指令&#xff0c;用户可以高效地执行文件管理、系统监控、进程控制等任务。虽然刚接触时可能感到有些复杂…

Elasticsearch使用记录

一、配环境 1.docker版本部署es 8.x系列可以关掉ssl&#xff08;本地测试时&#xff09;&#xff0c;去docker的/usr/share/elasticsearch/config/elasticsearch.yml里面的“xpack.security.enabled:”设置成true就可以 2.window docker部署推荐教程&#xff1a;基于Docker安…

MuJoCo(Multi-Joint Dynamics with Contact)机器人仿真器存在的问题

MuJoCo物理引擎计算接触力的核心思路&#xff0c;是通过数学优化的方式同时满足多个物理约束&#xff0c;而不是简单地为每个碰撞点单独计算作用力。它的工作流程可以理解为几个阶段的紧密配合。首先&#xff0c;仿真器会快速检测所有可能发生接触的物体表面&#xff0c;筛选出…

基础(项目管理工具:JIRA、禅道)

目录 JIRA JIRA介绍 JIRA中的优先级&#xff08;缺陷严重程度&#xff09; JIRA中的解决结果&#xff08;缺陷的解决结果&#xff09; JIRA中的问题状态&#xff08;缺陷的状态&#xff09; 使用JIRA创建缺陷 JIRA的安装&#xff08;Windows&#xff09; JDK22的下载和安…

16.使用豆包将docker-compose的yaml转为k8s的yaml,安装各种无状态服务

文章目录 docker方式httpbinit-toolslinux-commandmyipreference docker-compose安装k8s方式 docker方式 httpbin A simple HTTP Request & Response Service https://httpbin.org/ https://github.com/postmanlabs/httpbin https://github.com/mccutchen/go-httpbin do…

Day(22)--网络编程习题

习题 以下是这些 TCP 通信练习题的 Java 代码实现及解析&#xff1a; TCP 通信练习 1 - 多发多收 客户端&#xff08;Client1.java&#xff09; java import java.io.IOException; import java.io.OutputStream; import java.net.Socket; ​ public class Client1 {public…

20、.NET SDK概述

.NET SDK&#xff08;Software Development Kit&#xff09; 是微软提供的一套开发工具包&#xff0c;用于构建、运行和管理基于 .NET 平台的应用程序。它包含了一组丰富的工具、库和运行时环境&#xff0c;支持开发者在多种操作系统&#xff08;如 Windows、Linux 和 macOS&am…

DELL电脑开机进入自检界面

疑难解答 - 如何解决开机直接进入BIOS画面 添加链接描述 一、DELL电脑开机自检提示please run setup program 未设置一天中的时间-请运行安装程序(Time-of-day not set - please run SETUP program) 配置信息无效-请运行安装程序(Invalid configuration information - ple…

2025 最新版 Node.js 下载安装及环境配置详细教程【保姆级】

2025 最新版 Node.js 下载安装及环境配置详细教程【保姆级】 一、下载安装二、环境配置三、缓存配置、全局配置以及更换国内淘宝镜像源 一、下载安装 下载地址&#xff1a;Node.js 官方下载地址 双击安装&#xff0c;点击 Change 更改安装位置。我只有一个C盘&#xff0c;这里…

2025年4月通信科技领域周报(4.07-4.13):6G技术加速落地 卫星通信网络迎来组网高潮

2025年4月通信科技领域周报&#xff08;4.07-4.13&#xff09;&#xff1a;6G技术加速落地 卫星通信网络迎来组网高潮 目录 2025年4月通信科技领域周报&#xff08;4.07-4.13&#xff09;&#xff1a;6G技术加速落地 卫星通信网络迎来组网高潮一、本周热点回顾1. 华为发布全球首…

vxe-table 动态列筛选,以及筛选项动态变化的解决方案记录

需求场景&#xff1a; table 的列是由接口动态返回的&#xff1b;列的筛选项就是数据的值&#xff0c;比如【姓名】这个字段总共有三个值&#xff0c;那么姓名这一列的筛选项就是这三个值本身&#xff1b;当有一列筛选后&#xff0c;其他列的筛选项也要动态变化。 vxe-table …