2013-03-08 66 views
5

我已经实现了以下代码,用于在写入Azure数据库时处理具有指数退避的INSERT/UPDATE重试逻辑。SQL 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."); 
} 

但是我应该考虑对我的数据库读取应用重试逻辑吗?或者SqlCommand.CommandTimeout()方法是否足够?我大部分的读是使用下面的代码提起:

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

很难知道会发生在生产环境中使用Azure的,所以我想现在要做的尽可能多的缓解尽可能什么样的瞬态错误的。

回答

5

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

您是否看过Microsoft Patterns and Practices发布的transient fault handling application block,专门针对SQL数据库,而不是实施定制解决方案?

+0

我正在调查这个。 TFH块是否会提供有关连接丢失原因的详细信息? – QFDev 2013-03-10 11:33:27

4

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

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

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

这将发生在SQL Azure中。如果您使用的是ADO.NET,那么David对瞬态故障处理的建议就是要走的路。

如果你要使用实体框架,有一个好消息和一个坏消息:Transient Fault Handling with SQL Azure using Entity Framework

1

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