我在我的 azure asp.net 网站中使用 SQL Azure。偶尔,sql aerver 连接没有打开,我看到这个异常消息(本地和实时站点):
连接超时已过期。登录后阶段超时时间已过。连接可能在等待服务器完成登录过程并响应时超时;或者它可能在尝试创建多个活动连接时超时。
有人可以解释这些的原因,以及一个合适的解决方法吗?
我在我的 azure asp.net 网站中使用 SQL Azure。偶尔,sql aerver 连接没有打开,我看到这个异常消息(本地和实时站点):
连接超时已过期。登录后阶段超时时间已过。连接可能在等待服务器完成登录过程并响应时超时;或者它可能在尝试创建多个活动连接时超时。
有人可以解释这些的原因,以及一个合适的解决方法吗?
正如 Sharptooth 在他的评论中指出的那样;您将在 SQL Azure 上更频繁地遇到暂时性错误。Microsoft 提供了瞬态故障处理块,可解决常见的连接问题;允许您定义检测策略和重试策略。
有关瞬态故障处理块的功能的简要概述,请参见此处,有关如何将其添加到应用程序的指南,请参见此处(谢天谢地,您可以使用 NuGet)。
处理块主要像连接周围的 try/catch 块一样工作;DetectionStrategy
如果错误与策略中规定的错误匹配,则使用然后重试连接来捕获常见的连接错误。
我们将 LinqToSQL 与工作空间模式一起使用;包装我们的连接的块如下所示:
private const int DELAYMILLISECONDS = 250;
private const int MAXRETRIES = 10;
public static ApplicationDatabaseDataContext Create(string connectionString)
{
var policy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(
MAXRETRIES,
TimeSpan.FromMilliseconds(DELAYMILLISECONDS));
var applicationDatabaseDataContext =
policy.ExecuteAction(() => GetDataContext(connectionString));
return applicationDatabaseDataContext;
}
我们已经使用该块一段时间了,它为我们减轻了大部分这些问题。