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.pswp.cn/news/901715.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901715.shtml
英文地址,請注明出處:http://en.pswp.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 …