在过去的一天左右,我一直在尝试在 Azure SQL 数据库上实现瞬态故障处理。尽管我与数据库建立了有效的连接,但我不相信它会按预期处理瞬态故障。
到目前为止,我的方法涉及
public static void SetRetryStratPol()
{
const string defaultRetryStrategyName = "default";
var strategy = new Incremental(defaultRetryStrategyName, 3, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
var strategies = new List<RetryStrategy> { strategy };
var manager = new RetryManager(strategies, defaultRetryStrategyName);
RetryManager.SetDefault(manager);
retryPolicy = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(strategy);
retryPolicy.Retrying += (obj, eventArgs) =>
{
var msg = String.Format("Retrying, CurrentRetryCount = {0} , Delay = {1}, Exception = {2}", eventArgs.CurrentRetryCount, eventArgs.Delay, eventArgs.LastException.Message);
System.Diagnostics.Debug.WriteLine(msg);
};
}
Global.asax
我从's,中调用该方法Application_Start()
。[retryPolicy
是静态类上的全局静态变量,它也包括下一个方法。]
然后我有一个方法
public static ReliableSqlConnection GetReliableConnection()
{
var conn = new ReliableSqlConnection("Server=...,1433;Database=...;User ID=...;Password=...;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;", retryPolicy);
conn.Open();
return conn;
}
然后我用这个方法
using (var conn = GetReliableConnection())
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT COUNT(*) FROM ReliabilityTest";
result = (int) cmd.ExecuteScalarWithRetry();
return View(result);
}
到目前为止,这行得通。然后,为了测试重试策略,我尝试使用错误的用户名(来自这里的建议)。
但是当我单步执行该代码时,光标会立即跳转到我的catch
语句
用户“[我的用户名]”登录失败。
我原以为这个异常只会在几秒钟后被捕获,但根本不会产生延迟。
此外,我也尝试过使用实体框架,完全按照这篇文章,但得到了相同的结果。
我错过了什么?是否有配置步骤,或者我是否错误地引发了瞬态故障?