如何用C#实现数据库的连接失败重试?代码示例是什么?

来源:这里教程网 时间:2026-02-21 17:26:34 作者:

当数据库连接不稳定时,实现自动重试机制能有效提升程序的健壮性。在C#中,可以通过循环尝试连接,并配合延迟和异常捕获来实现连接失败重试。

使用 SqlConnection 和重试逻辑

下面是一个简单的示例,展示如何在连接 SQL Server 数据库时加入重试机制:

using System;
using System.Data.SqlClient;
using System.Threading;
class DatabaseHelper
{
    private static readonly int MaxRetries = 3;
    private static readonly int DelayMs = 2000; // 2秒延迟
    public static SqlConnection GetConnection(string connectionString)
    {
        for (int attempt = 1; attempt <= MaxRetries; attempt++)
        {
            try
            {
                var connection = new SqlConnection(connectionString);
                connection.Open();
                Console.WriteLine("数据库连接成功。");
                return connection;
            }
            catch (SqlException ex)
            {
                Console.WriteLine($"第 {attempt} 次连接失败:{ex.Message}");
                if (attempt == MaxRetries)
                {
                    Console.WriteLine("已达到最大重试次数,无法连接数据库。");
                    throw; // 重新抛出最后一次异常
                }
                Thread.Sleep(DelayMs); // 等待后再重试
            }
        }
        return null; // 不会执行到这里
    }
}

调用示例

使用上面的方法连接数据库:

class Program
{
    static void Main()
    {
        string connStr = "Server=localhost;Database=TestDB;User Id=sa;Password=yourpassword;";
        try
        {
            using (var conn = DatabaseHelper.GetConnection(connStr))
            {
                // 执行数据库操作
                using (var cmd = new SqlCommand("SELECT COUNT(*) FROM Users", conn))
                {
                    var count = cmd.ExecuteScalar();
                    Console.WriteLine($"用户总数:{count}");
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("最终连接失败:" + ex.Message);
        }
    }
}

使用 Polly 库(推荐方式)

对于更优雅的重试策略,推荐使用 Polly 库,它提供了丰富的弹性策略,如指数退避、超时等。

先通过 NuGet 安装 Polly:

Install-Package Polly

代码示例:

using Polly;
using Polly.Retry;
using System.Data.SqlClient;
public class ResilientDatabaseHelper
{
    private static readonly AsyncRetryPolicy<SqlConnection> RetryPolicy =
        Policy<SqlConnection>
            .Handle<SqlException>()
            .WaitAndRetryAsync(
                retryCount: 3,
                sleepDurationProvider: attempt => TimeSpan.FromSeconds(Math.Pow(2, attempt)), // 指数退避
                onRetry: (outcome, timespan, attempt, context) =>
                {
                    Console.WriteLine($"第 {attempt} 次重试,等待 {timespan.TotalSeconds} 秒。");
                });
    public static async Task<SqlConnection> GetConnectionAsync(string connectionString)
    {
        return await RetryPolicy.ExecuteAsync(async () =>
        {
            var connection = new SqlConnection(connectionString);
            await connection.OpenAsync();
            Console.WriteLine("数据库连接成功。");
            return connection;
        });
    }
}

Polly 的优势在于策略可复用、支持异步、且易于扩展,比如结合熔断、超时等策略。

基本上就这些。手动重试适合简单场景,Polly 更适合生产环境。

相关推荐