SQL Azure数据库重试逻辑

时间:2013-03-08 21:39:28

标签: sql azure error-handling azure-sql-database

在写入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的生产环境中会发生什么样的瞬态错误,所以我现在尽可能地做尽可能多的缓解。

3 个答案:

答案 0 :(得分:5)

我认为重试将成为您的Windows Azure SQL数据库操作的一部分。

您是不是实现了自定义解决方案,而是查看了Microsoft模式和实践发布的transient fault handling application block,特别是SQL数据库?

答案 1 :(得分:4)

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

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

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

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

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

答案 2 :(得分:1)

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