SQL Azure数据库重试逻辑

SQL Azure数据库重试逻辑,sql,azure,error-handling,azure-sql-database,Sql,Azure,Error Handling,Azure Sql Database,我已经实现了以下代码,用于在写入Azure数据库时使用指数退避处理插入/更新重试逻辑 static SqlConnection TryOpen(this SqlConnection connection) { int attempts = 0; while (attempts < 5) { try { if (attempts > 0) System.Threading.Thread.Sleep(((int)Math.Pow(3,

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

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.");
}

很难知道在使用Azure的生产环境中会发生什么类型的暂时性错误,因此我现在正在尝试尽可能多的缓解措施。

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


您没有实施自定义解决方案,而是查看了Microsoft发布的模式和实践,特别是针对SQL数据库的模式和实践吗?

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

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

作为一个例子,我每天在大约100000个数据库查询中遇到5次SQL Azure连接失败

这将在SQLAzure中发生。如果您使用的是ADO.NET,那么David关于瞬时故障处理的建议就是最好的选择


如果您打算使用实体框架,则有好消息和坏消息:

我已经实现了提供重试逻辑的
SqlConnection
SqlCommand
扩展方法。它可以在上获得。

我现在正在研究这个问题。TFH块是否会提供有关断开连接原因的详细信息?
Dim myDateAdapter As New SqlDataAdapter(mySqlCommand)
Dim ds As New DataSet
myDateAdapter.Fill(ds, "dtName")