【问题标题】:Implementing connection retry policy on failure to connect with database对数据库连接失败实施连接重试策略
【发布时间】:2018-04-23 14:31:47
【问题描述】:

我的数据库在云上,即 Azure,所以有时我会收到这样的网络相关错误:

与 SQL Server 建立连接时出现与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)

我决定在一段时间后使用Polly 重试连接尝试,但我不确定我是否以正确的方式使用它:

public class AddOperation
{
    public void Start()
    {
          using (var processor = new MyProcessor())
          {
              for (int i = 0; i < 2; i++)
              {
                  if(i==0)
                  {
                     var connection = new SqlConnection("Connection string 1");
                     processor.Process(connection);
                  }
                  else
                  {
                      var connection = new SqlConnection("Connection string 2");
                      processor.Process(connection);
                  }   
              }
          }
    }       
}

public class MyProcessor : IDisposable
{
    public void Process(DbConnection cn)
        {
            using (var cmd = cn.CreateCommand())
            {
                cmd.CommandText = "query";
                cmd.CommandTimeout = 1800;
                RetryPolicy retryPolicy = Policy
                      .Handle<DbException>()
                      .WaitAndRetry(new[]
                      {
                        TimeSpan.FromSeconds(3),
                        TimeSpan.FromSeconds(6),
                        TimeSpan.FromSeconds(9)
                      });
                retryPolicy.Execute(() => ConnectionManager.OpenConnection(cn));
                using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                { 
                   //code
                }
            }
        }
}

public class ConnectionManager
{
        public static void OpenConnection(DbConnection cn)
        {
            try
            {
                cn.Open();
                return;
            }
            catch(DbException ex)
            {
                throw ex;
            }
        }
    }

据我了解,Polly 的工作方式如下:

第一次尝试:等待 3 秒,然后再次调用 ConnectionManager.OpenConnection(cn)

第二次尝试:等待 6 秒,然后在 DbException 上再次调用 ConnectionManager.OpenConnection(cn)

第三次尝试:等待 9 秒,然后在 DbException 上再次调用 ConnectionManager.OpenConnection(cn)

但是如果DbException 再次出现怎么办?它会处理还是发送到我的 catch 子句包装 Process 方法?

我不确定我是否正确理解并正确实施。

我将不胜感激任何帮助:)

【问题讨论】:

    标签: c# sql-server connection-string polly transient-failure


    【解决方案1】:

    回复:

    如果 DbException 再次发生怎么办? [Polly] 是否会处理或发送到我的 catch 子句包装 Process 方法?

    Polly wiki for Retry 声明:

    如果操作抛出已处理的异常,则策略:

    • 计数异常
    • 检查是否允许再次重试。
      • 如果不是,则重新抛出异常并终止策略。

    simple example 可以证明这一点。

    【讨论】:

    • 如果第一次出现异常则等待3秒再重试。是这样吗?
    • 是的(带有问题中的配置)。 Polly wiki on retry 给出了策略操作的完整流程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    相关资源
    最近更新 更多