正确实现瞬态故障处理(Azure)

时间:2015-01-06 10:57:31

标签: c# azure azure-sql-database dbconnection

在过去的一天左右,我一直在尝试在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.asaxApplication_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,但得到的结果相同。

我错过了什么?是否存在配置步骤或我是否错误地引发了瞬态故障?

1 个答案:

答案 0 :(得分:11)

瞬态故障处理块用于处理瞬态错误。由于用户名/密码不正确而导致登录失败肯定不是其中之一。在此网页上:http://msdn.microsoft.com/en-us/library/dn440719%28v=pandp.60%29.aspx

  

什么是瞬态故障?

     

当应用程序使用服务时,可能会因错误而发生错误   临时条件,如间歇性服务,   基础架构级别的故障,网络问题或显式限制   服务;这些类型的错误更频繁地发生   基于云的服务,但也可以在本地解决方案中发生。如果   你在短时间内重试了这个操作(可能只有几个   毫秒后,操作可能会成功。这些类型的错误   条件称为瞬态故障。瞬态故障   通常很少发生,在大多数情况下,只有少数   重试是手术成功的必要条件。

您可能需要检查此应用程序块的源代码(http://topaz.codeplex.com/),并查看从SQL数据库返回的错误代码被视为暂时性错误,因此会重试。

您始终可以扩展功能并将登录失败作为测试代码的瞬态错误之一。

<强>更新

请在此处查看源代码:http://topaz.codeplex.com/SourceControl/latest#source/Source/TransientFaultHandling.Data/SqlDatabaseTransientErrorDetectionStrategy.cs。这是重试魔法发生的地方。你可以做的是创建一个类(让我们称之为CustomSqlDatabaseTransientErrorDetectionStrategy)并将整个代码从链接复制到这个类)。然后,出于测试目的,您可以将login failed方案添加为暂时性错误之一,并在应用程序中使用此类而不是SqlDatabaseTransientErrorDetectionStrategy