2014-06-13 39 views
7

我正在運行帶有使用實體框架6訪問的SQL Azure數據庫的.Net MVC Azure網站。間歇性地(在一千個左右的請求中)出現錯誤「 System.ComponentModel.Win32Exception:信號燈超時時間已過期」「信號量超時期限已過」SQL Azure

System.Data.SqlClient.SqlException: A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The semaphore timeout period has expired.) ---> System.ComponentModel.Win32Exception: The semaphore timeout period has expired

人們似乎沒有理由也和之前和之後的錯誤及其與SQL Azure的相互作用是罰款的請求。有沒有辦法處理或解決這個問題。

回答

10

Azure SQL與前提條件SQL非常不同。當Azure SQL Server過載或宕機時,它將斷開多個連接,並且當您重新連接時,您將被髮送到另一個SQL Server。

但是,對於TCP連接,您不知道另一端是否已終止連接,除非您實際上向其發送信息,這就是發生此錯誤的原因。

一旦你的代碼知道連接被終止,它會在下一個查詢中建立一個新的連接,這將工作得很好。

實體框架6你現在可以通過Transient Fault Handling with SQL Azure using Entity Framework

對付你需要設置你的SetExecutionStrategy並配置您的DBConfiguration類。只需在您的項目中創建一個新類並從DbConfiguration繼承。在Connection Resiliency/Retry Logic (EF6 onwards)

4

有一個已知問題,其中一個VIP交換期間出現這種情況,和EF6重試策略不會在這種情況下幫助

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

全部細節。

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