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);
}
}
});
问题太少了:
- 哪个更好,为什么?
- 是否真的需要外部
retryPolicy.ExecuteAction
- 在较旧的示例中,我看到人们只重试个别操作,如 OpenConnectionWithRetries
、ExecuteCommandWithRetries
等,而不是整个操作 - 我想知道如果可能的话,连接可能会在这些重试之间关闭。
最好使用的模式是 RetryPolicy.ExecuteAction(() => 。将您的数据库交互包装到 ExecuteAction() lambda 中并将其视为一个工作单元。这保持了与 ADO.Net 的 API。它还允许您使用 ADO.Net 中的新异步方法。
ReliableSQLConnection 主要用于向后兼容。
回答我自己的问题:
使用较新的瞬态错误处理块,将 SqlConnection 与提供的扩展方法(例如 OpenWithRetry 等)结合使用
使用retryPolicy.ExecuteAction(() => {...})只要在API中不支持重试,例如SqlBulkCopy,填充数据集table ,异步方法等。确保在重试块中重新打开连接。您仍然可以在重试块中使用带有可重试扩展方法的 SqlConnection。
更新:已编辑以减少混淆
尝试以正确的方式实现重试逻辑,但找不到任何关于如何正确利用 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);
}
}
});
问题太少了:
- 哪个更好,为什么?
- 是否真的需要外部
retryPolicy.ExecuteAction
- 在较旧的示例中,我看到人们只重试个别操作,如OpenConnectionWithRetries
、ExecuteCommandWithRetries
等,而不是整个操作 - 我想知道如果可能的话,连接可能会在这些重试之间关闭。
最好使用的模式是 RetryPolicy.ExecuteAction(() => 。将您的数据库交互包装到 ExecuteAction() lambda 中并将其视为一个工作单元。这保持了与 ADO.Net 的 API。它还允许您使用 ADO.Net 中的新异步方法。
ReliableSQLConnection 主要用于向后兼容。
回答我自己的问题:
使用较新的瞬态错误处理块,将 SqlConnection 与提供的扩展方法(例如 OpenWithRetry 等)结合使用
使用retryPolicy.ExecuteAction(() => {...})只要在API中不支持重试,例如SqlBulkCopy,填充数据集table ,异步方法等。确保在重试块中重新打开连接。您仍然可以在重试块中使用带有可重试扩展方法的 SqlConnection。
更新:已编辑以减少混淆