SQL Azure数据库重试逻辑
我已经实现了以下代码,用于在写入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,
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")