You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:15:00