5

我已经实现了以下代码,用于在写入 Azure 数据库时使用指数退避处理 INSERT/UPDATE 重试逻辑。

static SqlConnection TryOpen(this SqlConnection connection)
{
  int attempts = 0;
  while (attempts < 5)
  {
    try
    {
      if (attempts > 0)
       System.Threading.Thread.Sleep(((int)Math.Pow(3, attempts)) * 1000);
      connection.Open();
      return connection;
    }
    catch { }
    attempts++;
  }
  throw new Exception("Unable to obtain a connection to SQL Server or SQL Azure.");
}

但是,我是否也应该考虑为我的数据库读取应用重试逻辑?或者 SqlCommand.CommandTimeout() 方法就足够了吗?我的大部分阅读都是使用以下代码进行的:

Dim myDateAdapter As New SqlDataAdapter(mySqlCommand)
Dim ds As New DataSet
myDateAdapter.Fill(ds, "dtName")

很难知道在使用 Azure 的生产环境中会发生什么样的瞬态错误,所以我现在正在尝试尽可能多地进行缓解。

4

3 回答 3

5

我认为重试通常会成为 Windows Azure SQL 数据库操作的一部分。

您是否查看过Microsoft Patterns and Practices 专门针对 SQL 数据库发布的瞬态故障处理应用程序块,而不是实施自定义解决方案?

于 2013-03-08T21:43:50.537 回答
4

SQL Azure 中的连接失败很常见。这是因为您的应用程序将创建一个连接池,但是当您认为这些连接结束时,Azure 可能会在它们结束时终止它们,而您永远不会知道它。

他们这样做是出于正当的原因,例如特定实例已超载,并且正在将连接转移到另一个实例。使用内部 SQL Server,您通常不会遇到此问题,因为您的 SQL Server 始终可用且专用于您的使用。

例如,我在一天内对大约 100,000 个数据库查询进行了大约 5 次 SQL Azure 连接失败。

SQL Azure 会发生这种情况。如果您使用的是 ADO.NET,那么 David 关于瞬态故障处理的建议是可行的方法。

如果你打算使用实体框架,有好消息也有坏消息:Transient Fault Handling with SQL Azure using Entity Framework

于 2013-03-09T13:55:01.967 回答
1

我已经实现SqlConnectionSqlCommand扩展提供重试逻辑的方法。它在NuGet上可用。

于 2013-10-23T07:10:32.483 回答