【发布时间】: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