使用mysql .net connector如何持续检测MySQL连接并在连通时执行查询
基于MySQL .NET Connector的连接状态监测与查询实现方案
前置依赖
首先安装NuGet包:MySqlConnector(当前官方维护的MySQL .NET驱动,性能和兼容性优于旧版本Oracle官方驱动)
核心实现逻辑
不使用同步死循环阻塞主线程,采用异步后台任务加间隔等待的方案,避免CPU空转,同时支持应用退出时正常终止任务。
1. 封装连接检测方法
using MySqlConnector; // 替换为实际业务的数据库连接字符串,设置短连接超时避免单次检测等待过久 private const string ConnectionString = "server=127.0.0.1;port=3306;user=root;password=你的密码;database=你的库名;ConnectionTimeout=3;"; /// <summary> /// 异步检测数据库连接是否正常 /// </summary> private async Task<bool> CheckConnectionAliveAsync(CancellationToken cancellationToken) { try { using var conn = new MySqlConnection(ConnectionString); await conn.OpenAsync(cancellationToken); // 用Ping做轻量检测,比执行SELECT 1开销更低 return await conn.PingAsync(cancellationToken); } catch (MySqlException) { // 连接类异常直接返回连接失败 return false; } catch (OperationCanceledException) { // 任务取消时抛出,上层按需处理 throw; } }
2. 封装监测+查询逻辑
/// <summary> /// 后台监测主逻辑 /// </summary> private async Task StartMonitoringAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { var isConnected = await CheckConnectionAliveAsync(stoppingToken); if (isConnected) { try { // 连接正常,执行业务查询 using var conn = new MySqlConnection(ConnectionString); await conn.OpenAsync(stoppingToken); // 替换为实际的SELECT查询语句 const string querySql = "SELECT id, content FROM your_table LIMIT 10;"; using var cmd = new MySqlCommand(querySql, conn); using var reader = await cmd.ExecuteReaderAsync(stoppingToken); // 处理查询结果 while (await reader.ReadAsync(stoppingToken)) { var id = reader.GetInt32("id"); var content = reader.GetString("content"); // 控制台/UI展示逻辑,WinForm/WPF需要回UI线程操作控件 Console.WriteLine($"查询结果:id={id}, content={content}"); } // 按需调整:如果只需要连接成功后执行一次,此处加break退出循环 // 如果需要持续周期执行查询,设置等待间隔后继续轮询 await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken); } catch (MySqlException ex) { // 查询过程中连接断开,回到重连逻辑 Console.WriteLine($"查询执行失败:{ex.Message},将重新检测连接"); await Task.Delay(TimeSpan.FromSeconds(2), stoppingToken); } } else { // 连接失败,间隔2秒重试,避免频繁请求占用资源 await Task.Delay(TimeSpan.FromSeconds(2), stoppingToken); } } }
不同项目场景的启动方式
- ASP.NET Core项目:将上述逻辑封装为继承
BackgroundService的托管服务,在Program.cs中注册即可:builder.Services.AddHostedService<MySqlMonitorService>(); - WinForm/WPF项目:在窗体加载事件中启动后台任务,声明全局
CancellationTokenSource _cts = new CancellationTokenSource();,调用_ = Task.Run(() => StartMonitoringAsync(_cts.Token));,窗体关闭时执行_cts.Cancel()停止后台任务即可
注意事项
- 不要使用同步
Thread.Sleep或者无等待的死循环,会导致CPU占用过高,异步Task.Delay不会阻塞线程 - 如果查询结果需要更新UI控件,WinForm需要用
Control.Invoke、WPF需要用Dispatcher切回UI线程操作,避免跨线程访问异常 - 连接字符串中建议设置
ConnectionTimeout不超过5秒,避免单次连接检测阻塞过久
内容的提问来源于stack exchange,提问作者Acid Rain
相关产品推荐
相关产品推荐

