在写入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的生产环境中会发生什么样的瞬态错误,所以我现在尽可能地做尽可能多的缓解。
答案 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)
我已经实现了提供重试逻辑的SqlConnection
和SqlCommand
扩展方法。它可以在NuGet上找到。