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

C#多线程异步连接MySQL与SQLserver数据库

C#多线程异步连接MySQL与SQLserver数据库

  • 一、前言
  • 二、多线程异步连接数据库代码
    • 2.1代码块
    • 2.2代码说明
  • 参考文档

一、前言

当编写代码连接多台设备上的数据库时,如果采用同步逐个连接的方式,在网络畅通的情况下连接速度尚可,但当其中一台设备网络不佳特别是处于关机状态时,等待数据库连接同时程序无法响应的时间会大幅度增加,即使设置Connect Timeout也无法缩短等待时间,因为此时是程序在等待TCP应答,等待时间通常是由 TCP 协议本身的机制控制。

考虑到此类异常情况的处理,可以使用多线程连接技术,使用线程控制连接超时问题,而异步连接可以在进行连接的同时进行其他操作。

二、多线程异步连接数据库代码

2.1代码块

private async Task<(bool isSuccess, string message)> TryConnectWithTimeoutAsync(object conn, int timeout)
{Stopwatch sw = new Stopwatch();bool connectSuccess = false;string message = "";// 创建取消令牌源CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();CancellationToken token = cancellationTokenSource.Token;// 创建连接任务Task connectTask = Task.Run(() =>{try{sw.Start();if(conn is SqlConnection){((SqlConnection)conn).Open();}if (conn is MySqlConnection){((MySqlConnection)conn).Open();}connectSuccess = true;message = "数据库连接成功";}catch (Exception ex){message = $"数据库连接失败:{ex.Message}";}}, token);// 创建超时任务Task timeoutTask = Task.Delay(timeout, token);// 等待连接任务或超时任务哪个先完成Task completedTask = await Task.WhenAny(connectTask, timeoutTask);if (completedTask == timeoutTask){// 如果超时先完成,取消连接任务cancellationTokenSource.Cancel();message = "数据库连接超时";}return (connectSuccess, message);
}public async Task ConnectMultipleDatabasesAsync(int timeout, List<MySqlConnection> mySqlConnections)
{var tasks = new List<Task>();for (int i = 0; i < mySqlConnections.Count; i++){tasks.Add(TryConnectWithTimeoutAsync(mySqlConnections[i], timeout));}var results = await Task.WhenAll(tasks); // 等待所有任务完成for (int i = 0; i < results.Length; i++){var (isSuccess, message) = results[i];Console.WriteLine($"{message}");}
}

2.2代码说明

上面代码定义了两个异步执行的函数,TryConnectWithTimeoutAsync和ConnectMultipleDatabasesAsync。TryConnectWithTimeoutAsync支持MySQL数据库连接和SQLserver数据库连接返回Tuple类型描述数据库连接情况,执行单个数据库连接任务。
ConnectMultipleDatabasesAsync接受多个数据库连接对象输入,内部调用TryConnectWithTimeoutAsync,进行多个数据库连接任务timeout参数控制每个连接任务超时,单位为毫秒

实际使用时,可通过如下代码进行ConnectMultipleDatabasesAsync调用:

public async void UserFunc(List<MySqlConnection> mySqlConnections)
{await Task.Run(async () =>{await ConnectMultipleDatabasesAsync(mySqlConnections, 5000);//超时等待5000毫秒});
}

参考文档

C# 测试SqlServer连接及设置连接超时时间
C# 控制连接超时处理方法-连接数据库与连接网络路径超时情况

相关文章:

C#多线程异步连接MySQL与SQLserver数据库

C#多线程异步连接MySQL与SQLserver数据库 一、前言二、多线程异步连接数据库代码2.1代码块2.2代码说明 参考文档 一、前言 当编写代码连接多台设备上的数据库时&#xff0c;如果采用同步逐个连接的方式&#xff0c;在网络畅通的情况下连接速度尚可&#xff0c;但当其中一台设备…...

try learning-git-branching

文章目录 mergerebase分离 HEAD相对引用利用父节点branch -f 撤销变更cherry-pick交互式 rebase只取一个提交记录提交的技巧rebase 在上一次提交上amendcherry-pick 在上一次提交上 amend tag多分支 rebase两个parent节点纠缠不清的分支偏离的提交历史锁定的Main learning git …...

代码随想录算法【Day46】

Day46 647. 回文子串 class Solution { public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result 0;for (int i s.size() - 1; i > 0; i--) { // 注意遍历顺序for (int j i; j < s…...

flutter本地推送 flutter_local_notifications的使用记录

flutter_local_notifications 效果 安卓配置(AndroidManifest.xml) <uses-permission android:name"com.android.alarm.permission.SET_ALARM"/> <uses-permission android:name"android.permission.SCHEDULE_EXACT_ALARM" /> <us…...

Springboot 中如何使用Sentinel

在 Spring Boot 中使用 Sentinel 非常方便&#xff0c;Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 组件&#xff0c;可以快速将 Sentinel 集成到你的 Spring Boot 应用中&#xff0c;并利用其强大的流量控制和容错能力。 下面是一个详细的步骤指南 …...

AI Agent 有哪些痛点问题

AI Agent 有哪些痛点问题 目录 AI Agent 有哪些痛点问题身份安全问题数据安全问题模型安全问题可靠性问题伦理和合规问题身份安全问题 身份界定模糊:AI代理既非完全意义上的人类,也不同于传统的机器,现有的身份管理工具难以准确对其进行定位和管理,导致在权限分配、责任追溯…...

一个让Stable Diffusion更稳定、更易用的Github开源项目

2023除了ChatGPT大火&#xff0c;Stable Diffusion同样也是非常火热&#xff0c;Stable Diffusion是一个Github开源项目&#xff0c;很多爱好者都会本地安装&#xff0c;但面对一些初学者来说&#xff0c;在安装、配置和使用过程中还是会经常出现很多问题&#xff0c;特别不了解…...

Docker+Jenkins自动化部署SpringBoot项目【详解git,jdk,maven,ssh配置等各种配置,附有示例+代码】

文章目录 DockerJenkins部署SpringBoot项目一.准备工作1.1安装jdk111.2安装Maven 二.Docker安装Jenkins2.1安装Docker2.2 安装Jenkins2.3进入jenkins 三.Jenkins设置3.1安装jenkins插件3.2全局工具配置全局配置jdk全局配置maven全局配置git 3.3 系统配置安装 Publish Over SSH …...

.NET SixLabors.ImageSharp v1.0 图像实用程序控制台示例

使用 C# 控制台应用程序示例在 Windows、Linux 和 MacOS 机器上处理图像&#xff0c;包括创建散点图和直方图&#xff0c;以及根据需要旋转图像以便正确显示。 这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包&#xff08;版本 1.0.4&#xff09;添加到.NET Core 3.1/ …...

【机器学习】线性回归与一元线性回归

线性回归与一元线性回归 V1.1线性回归问题线性方程的最优解一元线性回归一元线性回归的方程一元线性回归距离衡量方法一元线性回归的最优化求解一元线性回归的最小二乘法解法 V1.1 线性回归问题 线性回归问题就是找一条线或超平面&#xff0c;并使用线或超平面来描述数据分布…...

soular基础教程-使用指南

soular是TikLab DevOps工具链的统一帐号中心&#xff0c;今天来介绍如何使用 soular 配置你的组织、工作台&#xff0c;快速入门上手。 &#xfeff; 1. 账号管理 可以对账号信息进行多方面管理&#xff0c;包括分配不同的部门、用户组等&#xff0c;从而确保账号权限和职责…...

《Spring实战》(第6版)第1章 Spring起步

第1部分 Spring基础 第1章 Spring起步 1.1 什么是Spring Spring的核心是提供一个容器(container)。 称为Spring应用上下文(Spring application context)。 创建和管理应用的组件(bean)&#xff0c;与上下文装配在一起。 Bean装配通过依赖注入(Dependency Injection,DI)。…...

PAT乙级真题 — 1084 外观数列(java)

外观数列是指具有以下特点的整数序列&#xff1a; d, d1, d111, d113, d11231, d112213111, ...它从不等于 1 的数字 d 开始&#xff0c;序列的第 n1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d&#xff0c;所以就是 d1&#xff1b;第 2 项是 1 个 d&#xff08;对…...

I.MX6ull 看门狗

一、看门狗介绍 WatchDog是为了能够防止程序跑飞而使用的一种硬件模块。如果你的程序没有跑飞&#xff0c;那么你的程序会 定时的去喂看门狗&#xff1b;如果你的程序跑飞了,那么就不会再去喂狗了&#xff0c;如果超过了喂狗的时间&#xff0c;那么狗就会 自己生成一个信号来重…...

鲸鱼算法优化Transformer+KAN网络并应用于时序预测任务

&#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; 本次博客内容将聚焦于深度学习的相关知识与实践 &#x1f389;作者简介&#xff1a;⭐️⭐️⭐️主要研究方向涵盖深度学习、计算机视觉等方向。 &#x1f4dd;目前更新&#x…...

一维差分算法篇:高效处理区间加减

那么在正式介绍我们的一维差分的原理前&#xff0c;我们先来看一下一维差分所应用的一个场景&#xff0c;那么假设我们现在有一个区间为[L,R]的一个数组&#xff0c;那么我要在这个数组中的某个子区间比如[i,m] (L<i<m<R)进行一个加k值或者减去k值的一个操作&#xff…...

export关键字

注意点&#xff1a; 使用 export 和 import 时&#xff0c;确保你的JavaScript环境支持ES6模块 在JavaScript中&#xff0c;export 关键字主要用于模块化编程&#xff0c;允许你将代码的不同部分导出&#xff0c;使得其他模块可以通过 import 关键字来引入这些部分。这是ES6&a…...

【C++】基础入门(详解)

&#x1f31f; Hello&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; 目录 输入&输出 缺省参数(默认参数) 函数重载 引用 概念及定义 特性及使用 const引用 与指针的关系 内联inline和nullptr in…...

【快速入门】Unity 常用组件(功能块)

欢迎关注 、订阅专栏 【unity 新手教程】谢谢你的支持&#xff01;&#x1f49c;&#x1f49c; 文章目录 Unity 常用组件&#xff08;功能块&#xff09;&#xff1a;Transform - 变换&#xff1a;坐标、朝向、大小Mesh Filter - 加载网格数据Mesh Renderer- 渲染网格Camera - …...

Nessus 工具使用全攻略

目录 一、Nessus&#xff1a;网络安全的坚固防线 二、Nessus 安装指南 &#xff08;一&#xff09;获取安装包 &#xff08;二&#xff09;安装流程 三、初次配置&#xff1a;开启 Nessus 的第一步 &#xff08;一&#xff09;账号注册 &#xff08;二&#xff09;激活 …...

1441. 用栈操作构建数组 中等

1441. 用栈操作构建数组 给你一个数组 target 和一个整数 n。每次迭代&#xff0c;需要从 list { 1 , 2 , 3 ..., n } 中依次读取一个数字。 请使用下述操作来构建目标数组 target &#xff1a; "Push"&#xff1a;从 list 中读取一个新元素&#xff0c; 并将其推入…...

【Springboot知识】从零开始配置springfox

文章目录 配置过程1. 添加依赖2. 创建Swagger配置类3. 配置Swagger UI4. 自定义Swagger配置&#xff08;可选&#xff09;4.1 添加全局请求参数4.2 配置响应消息 5. 运行项目并访问Swagger UI6. 其他注意事项7. 使用Springfox 3.x&#xff08;可选&#xff09;总结 忽略登录验证…...

PHP代驾系统小程序

&#x1f697; 代驾系统 —— 安全、便捷、智能的出行新选择 &#x1f527; 一款基于先进ThinkPHPUniapp技术架构&#xff0c;匠心独运的代驾软件横空出世&#xff0c;微信小程序端率先登场&#xff0c;为您的出行之旅增添前所未有的便捷与安全。它不仅是您贴心的出行助手&…...

pg认证需要培训机构吗

认证类型决定是否需要培训机构 官方认证 PostgreSQL社区认证&#xff1a;PostgreSQL社区并未强制要求通过培训机构才能参加认证考试。例如&#xff0c;PostgreSQL Professional Certification&#xff08;由社区认可的机构提供&#xff09;通常允许考生自学后直接报名考试。 Po…...

网络安全扫描--基础篇

前言 1、了解互联网安全领域中日趋重要的扫描技术 2、了解在不同网络场景下扫描技术手段 3、熟悉linux下系统内核防护策略并能大件一个有效的系统防护体系 4、增强工作安全意识&#xff0c;并能有效的实践于工作场景中 目录 1、熟悉主机扫描工具&#xff08;fping&#xff0c;…...

【MySQL数据库】Ubuntu下的mysql

目录 1&#xff0c;安装mysql数据库 2&#xff0c;mysql默认安装路径 3&#xff0c;my.cnf配置文件? 4&#xff0c;mysql运用的相关指令及说明 5&#xff0c;数据库、表的备份和恢复 mysql是一套给我们提供数据存取的&#xff0c;更加有利于管理数据的服务的网络程序。下…...

GPQA (Graduate-Level Google-Proof QA Benchmark) 数据集

标题&#xff1a;挑战人类与AI的极限&#xff1a;GPQA——一个面向未来的高难度科学问答基准 引言 在人工智能快速发展的今天&#xff0c;大型语言模型&#xff08;如GPT-4&#xff09;已能在许多任务中媲美甚至超越人类表现。然而&#xff0c;当面对需要高度专业知识的问题时&…...

WebRTC与EasyRTC:开启智能硬件音视频通讯的全新旅程

在当今数字化时代&#xff0c;音视频通讯技术正以前所未有的速度革新着我们的生活与工作方式。WebRTC与EasyRTC作为这一领域的佼佼者&#xff0c;正携手为智能硬件的音视频通讯注入强大动力&#xff0c;开启全新的篇章。 一、WebRTC与智能硬件融合的崭新趋势 WebRTC技术&…...

利用ffplay播放udp组播视频流

ffplay -fs -fflags nobuffer -flags low_delay -analyzeduration 0 -probesize 32 -framedrop -sync ext -strict experimental udp://224.1.1.1:5001 -fs : 全屏显示 -fflags nobuffer &#xff1a; 禁用输入缓冲&#xff08;减少100-200ms缓冲延迟&#xff09; -an…...

基于Ceedling的嵌入式软件单元测试

Ceedling 如果你使用 Ceedling&#xff08;一个针对 C 代码单元测试的构建管理器&#xff09;&#xff0c;可以更方便地管理测试。Ceedling 会自动处理 Unity 和 CMock 的集成&#xff0c;无需手动编写 Makefile。 1.环境搭建 1.1 Ruby环境 sudo apt-get install ruby1.2 安…...