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

打印 上一主题 下一主题

主题 988|帖子 988|积分 2964

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、前言

当编写代码连接多台设备上的数据库时,如果采用同步逐个连接的方式,在网络流通的环境下连接速度尚可,但当其中一台设备网络不佳特殊是处于关机状态时,等候数据库连接同时程序无法相应的时间会大幅度增长,即使设置Connect Timeout也无法缩短等候时间,由于此时是程序在等候TCP应答,等候时间通常是由 TCP 协议本身的机制控制。
思量到此类异常环境的处置惩罚,可以利用多线程连接技术,利用线程控制连接超时题目,而异步连接可以在进行连接的同时进行其他操作。
二、多线程异步连接数据库代码

2.1代码块

  1. private async Task<(bool isSuccess, string message)> TryConnectWithTimeoutAsync(object conn, int timeout)
  2. {
  3.     Stopwatch sw = new Stopwatch();
  4.     bool connectSuccess = false;
  5.     string message = "";
  6.     // 创建取消令牌源
  7.     CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
  8.     CancellationToken token = cancellationTokenSource.Token;
  9.     // 创建连接任务
  10.     Task connectTask = Task.Run(() =>
  11.     {
  12.         try
  13.         {
  14.             sw.Start();
  15.             if(conn is SqlConnection)
  16.             {
  17.                 ((SqlConnection)conn).Open();
  18.             }
  19.             if (conn is MySqlConnection)
  20.             {
  21.                 ((MySqlConnection)conn).Open();
  22.             }
  23.             connectSuccess = true;
  24.             message = "数据库连接成功";
  25.         }
  26.         catch (Exception ex)
  27.         {
  28.             message = $"数据库连接失败:{ex.Message}";
  29.         }
  30.     }, token);
  31.     // 创建超时任务
  32.     Task timeoutTask = Task.Delay(timeout, token);
  33.     // 等待连接任务或超时任务哪个先完成
  34.     Task completedTask = await Task.WhenAny(connectTask, timeoutTask);
  35.     if (completedTask == timeoutTask)
  36.     {
  37.         // 如果超时先完成,取消连接任务
  38.         cancellationTokenSource.Cancel();
  39.         message = "数据库连接超时";
  40.     }
  41.         return (connectSuccess, message);
  42. }
  43. public async Task ConnectMultipleDatabasesAsync(int timeout, List<MySqlConnection> mySqlConnections)
  44. {
  45.     var tasks = new List<Task>();
  46.     for (int i = 0; i < mySqlConnections.Count; i++)
  47.     {
  48.         tasks.Add(TryConnectWithTimeoutAsync(mySqlConnections[i], timeout));
  49.     }
  50.     var results = await Task.WhenAll(tasks); // 等待所有任务完成
  51.     for (int i = 0; i < results.Length; i++)
  52.     {
  53.         var (isSuccess, message) = results[i];
  54.         Console.WriteLine($"{message}");
  55.     }
  56. }
复制代码
2.2代码阐明

上面代码定义了两个异步执行的函数,TryConnectWithTimeoutAsync和ConnectMultipleDatabasesAsync。TryConnectWithTimeoutAsync支持MySQL数据库连接和SQLserver数据库连接,返回Tuple类型描述数据库连接环境,执行单个数据库连接任务。
ConnectMultipleDatabasesAsync接受多个数据库连接对象输入,内部调用TryConnectWithTimeoutAsync,进行多个数据库连接任务,timeout参数控制每个连接任务超时,单位为毫秒。
现实利用时,可通过如下代码进行ConnectMultipleDatabasesAsync调用:
  1. public async void UserFunc(List<MySqlConnection> mySqlConnections)
  2. {
  3.     await Task.Run(async () =>
  4.     {
  5.         await ConnectMultipleDatabasesAsync(mySqlConnections, 5000);//超时等待5000毫秒
  6.     });
  7. }
复制代码
参考文档

C# 测试SqlServer连接及设置连接超时时间
C# 控制连接超时处置惩罚方法-连接数据库与连接网络路径超时环境

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表