1

我有我的云数据库,即 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 秒,然后ConnectionManager.OpenConnection(cn)再次调用DbException

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

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

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

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

4

1 回答 1

1

回覆:

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

重试的Polly wiki状态:

如果操作引发已处理的异常,则策略:

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

一个简单的例子可以证明这一点。

于 2018-04-23T17:10:37.347 回答