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

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# 控制连接超时处理方法-连接数据库与连接网络路径超时情况

相关文章:

  • E卷-MELON的难题-(200分)
  • 功能说明并准备静态结构
  • 硕成C语言22【一些算法和数组的概念】
  • 【C++】哈希、unordered_map与unordered_set的模拟实现
  • AcWing——3624. 三值字符串
  • windows配置永久路由
  • VMware vSphere数据中心虚拟化——vCenter Server7.0安装部署
  • 【ARM】解决ArmDS Fast Models 中部分内核无法上电的问题
  • 深入理解 Qt 信号与槽机制:原理、用法与优势
  • Spring Boot 携手 DeepSeek:开启智能交互新时代
  • C语言进阶习题【3】(5 枚举)——找单身狗2
  • 3DsMax快捷键
  • 【kafka系列】Kafka事务的实现原理
  • VSCode C/C++ 开发环境完整配置及常见问题(自用)
  • java枚举类型的查找
  • USC 安防平台之移动侦测
  • github上文件过大无法推送问题
  • 智能编程助手功能革新与价值重塑之:GitHub Copilot
  • 今日写题work05
  • Autojs: 使用 SQLite
  • 专访|“甲亢哥”的操盘手,带NBA球星们玩转中国流量
  • 中国公民免签赴马来西亚的停留天数如何计算?使馆明确
  • 联合国秘书长古特雷斯呼吁印巴保持最大克制
  • 贵州黔西市游船倾覆事故最后一名失联人员被找到,但已无生命体征
  • 竞彩湃|新科冠军利物浦留力?纽卡斯尔全力冲击欧冠
  • 辽宁召开假期安全生产工作调度会:绝不允许层层失守,绝不允许“带病运行”