我有我的云数据库,即 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 方法?
我不确定我是否正确理解并正确实施。
我将不胜感激任何帮助:)