繁体   English   中英

“信号量超时期限已过期”SQL Azure

[英]“The semaphore timeout period has expired” SQL Azure

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

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

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

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))); 
    } 
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM