"信号量超时期限已过期"SQL Azure

Ale*_*exC 10 asp.net-mvc entity-framework azure azure-sql-database

我正在运行一个带有使用Entity Framework 6访问的SQL Azure数据库的.Net MVC Azure网站.间歇性地(大约一千个请求中有一个),我收到错误"System.ComponentModel.Win32Exception:信号量超时期限已过期"

System.Data.SqlClient.SqlException:从服务器接收结果时发生传输级错误.(提供程序:TCP提供程序,错误:0 - 信号量超时期限已过期.)---> System.ComponentModel.Win32Exception:信号量超时期限已过期

似乎没有理由在错误之前和之后以及它们与SQL Azure的交互都很好.有没有办法处理或解决这个问题.

Ada*_*ley 15

Azure SQL与内部SQL非常不同.当Azure SQL Server过载或关闭时,它将断开许多连接,当您重新连接时,您将被发送到另一个SQL Server.

但是,对于TCP连接,您不知道另一端是否已终止连接,除非您实际向下发送信息,这就是发生此错误的原因.

一旦你的代码知道连接被终止,它就会在下一个查询上建立一个新的连接,这将很好地工作.

使用Entity Framework 6,您现在可以使用Entity Framework处理SQL Azure的瞬态故障处理

在DBConfiguration类中,您需要设置SetExecutionStrategy并对其进行配置.只需在项目中创建一个新类,并从DbConfiguration继承.

public class MyConfiguration : DbConfiguration 
{ 
    public MyConfiguration() 
    { 
        SetExecutionStrategy( 
            "System.Data.SqlClient", 
            () => new SqlAzureExecutionStrategy(1, TimeSpan.FromSeconds(30))); 
    } 
}
Run Code Online (Sandbox Code Playgroud)

连接弹性/重试逻辑的全部细节(EF6以上)