SQL Azure使用EnterpriseLibrary.TransientFaultHandling重试逻辑

时间:2015-02-12 07:14:54

标签: c# azure-sql-database enterprise-library

尝试以正确的方式实现重试逻辑,但找不到有关如何正确利用EnterpriseLibrary.TransientFaultHandling的任何好的示例。 到目前为止,我发现了两个样本:

首先 - 使用ReliableSqlConnection& conn.Open(retryPolicy)

var retryStrategy = new Incremental(3, TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1));
var retryPolicy = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(retryStrategy);

retryPolicy.ExecuteAction(() =>
{
    using (var conn = new ReliableSqlConnection(datasetConnectionString))
    {
        conn.Open(retryPolicy);

        using (var command = conn.CreateCommand())
        {
            command.CommandText = insertToParameters;
            command.CommandTimeout = 0;
            conn.ExecuteCommand(command);
        }
    }
});

和第二个 - 没有ReliableSqlConnection:

var retryStrategy = new Incremental(3, TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1));
var retryPolicy = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(retryStrategy);

retryPolicy.ExecuteAction(() =>
{
    using (var conn = new SqlConnection(datasetConnectionString))
    {
        conn.Open();

        using (var command = conn.CreateCommand())
        {
            command.CommandText = insertToParameters;
            command.CommandTimeout = 0;
            conn.ExecuteCommand(command);
        }
    }
});

问题很少:

  1. 哪一个更好,为什么?
  2. 外部retryPolicy.ExecuteAction是否真的需要 - 在较旧的示例中,我看到人们只重试个别操作,例如OpenConnectionWithRetriesExecuteCommandWithRetries等,但不是整件事 - 我想知道是否可能在这些重试之间可能会关闭连接。

2 个答案:

答案 0 :(得分:3)

回答我自己的问题:

使用较新的瞬态错误处理块,使用SqlConnection和提供的扩展方法,例如OpenWithRetry等。

每当API中不支持重试时,请使用retryPolicy.ExecuteAction(()=&gt; {...}),例如SqlBulkCopy,填充数据集表,异步方法等。确保重新打开重试块中的连接。您仍然可以在重试块内使用带有可重试扩展方法的SqlConnection。

更新:编辑以减少混淆

答案 1 :(得分:1)

使用的最佳模式是RetryPolicy.ExecuteAction(()=&gt;。将您的数据库交互包装到ExecuteAction()lambda中并将其视为一个工作单元。这样可以保持与ADO.Net的最高级别的兼容性。 39; s API。它还允许您使用ADO.Net中的新Async方法。

ReliableSQLConnection主要用于向后兼容。