SQL 使用 EnterpriseLibrary.TransientFaultHandling 的 Azure 重试逻辑

SQL Azure retry logic using EnterpriseLibrary.TransientFaultHandling

尝试以正确的方式实现重试逻辑,但找不到任何关于如何正确利用 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 等,而不是整个操作 - 我想知道如果可能的话,连接可能会在这些重试之间关闭。

最好使用的模式是 RetryPolicy.ExecuteAction(() => 。将您的数据库交互包装到 ExecuteAction() lambda 中并将其视为一个工作单元。这保持了与 ADO.Net 的 API。它还允许您使用 ADO.Net 中的新异步方法。

ReliableSQLConnection 主要用于向后兼容。

回答我自己的问题:

使用较新的瞬态错误处理块,将 SqlConnection 与提供的扩展方法(例如 OpenWithRetry 等)结合使用

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

更新:已编辑以减少混淆