【问题标题】:"The semaphore timeout period has expired" SQL Azure“信号量超时期限已过”SQL Azure
【发布时间】:2015-03-05 13:22:50
【问题描述】:

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

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

似乎没有原因,错误前后的请求以及它们与 SQL Azure 的交互都很好。有没有办法处理或解决这个问题。

【问题讨论】:

    标签: asp.net-mvc entity-framework azure azure-sql-database


    【解决方案1】:

    Azure SQL 与本地 SQL 非常不同。当 Azure SQL Server 过载或出现故障时,它将断开许多连接,当您重新连接时,您将被发送到另一个 SQL Server。

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

    一旦您的代码知道连接已终止,它会在下一次查询时建立一个新连接,这将正常工作。

    使用 Entity Framework 6,您现在可以处理 Transient Fault Handling with SQL Azure using Entity Framework

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

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

    详细信息Connection Resiliency / Retry Logic (EF6 onwards)

    【讨论】:

      【解决方案2】:

      有一个已知问题是在 VIP 交换期间发生这种情况,并且 EF6 重试策略在这种情况下没有帮助。

      https://social.msdn.microsoft.com/Forums/azure/en-US/5e195f94-d4d2-4c2d-8a4e-7d66b4761510/vip-swap-and-the-semaphore-timeout-period-has-expired-errors?forum=ssdsgetstarted&prof=required

      【讨论】:

        猜你喜欢
        • 2014-04-13
        • 1970-01-01
        • 2012-09-03
        • 2015-08-05
        • 2014-09-24
        • 2019-12-22
        • 2012-12-09
        • 2017-02-06
        相关资源
        最近更新 更多