【发布时间】:2015-03-04 00:47:47
【问题描述】:
过去一天左右,我一直在尝试在 Azure SQL 数据库上实现瞬态故障处理。尽管我与 DB 建立了有效连接,但我不相信它会按预期处理瞬态故障。
到目前为止,我的方法涉及
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 的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);
}
到目前为止,这是可行的。然后,为了测试重试策略,我尝试使用错误的用户名(来自here 的建议)。
但是当我单步执行该代码时,光标会立即跳转到我的 catch 语句,并带有
用户“[我的用户名]”登录失败。
我原以为这个异常只会在几秒钟后被捕获,但根本不会产生延迟。
此外,我还尝试使用实体框架,完全遵循 this post,但得到相同的结果。
我错过了什么?是否有配置步骤,或者我是否错误地引发了瞬态故障?
【问题讨论】:
标签: c# azure azure-sql-database dbconnection