发生传输级别错误(提供程序:TCP提供程序,错误:0 - 信号量超时期限已过期。)

时间:2017-12-05 09:57:40

标签: c# entity-framework-6 azure-sql-database enterprise-library

我已经阅读了这些SO问题和MS Docs:

并且有同样的错误。我的ConnectionString中没有任何这些: ConnectRetryCount,ConnectRetryInterval或Connection Timeout。

这是我的DB类的一种方法:

public DataTable ExecuteSqlCommand(SqlCommand com)
{
    var retryStrategy = new Incremental(5, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
    var retryPolicy = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(retryStrategy);

    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DataContext"].ToString());

    com.Connection = con;
    SqlDataAdapter da = new SqlDataAdapter(com);
    DataTable dt = new DataTable();
    try
    {
        retryPolicy.ExecuteAction(() =>
        {
            con.Open();
            da.Fill(dt);
        });
    }
    catch (Exception e)
    {
        var telemetry = new TelemetryClient(); // app insights (azure)
        telemetry.TrackException(e);
    }
    finally
    {
        con.Close();
    }
    return dt;
}

那会更好些什么?从我的代码中删除重试内容并使用我的连接字符串中的属性?让框架完成工作?或者我目前的重试代码是否足够?我觉得企业库和重试的东西已经过时了,但找不到确定我想法的好来源。

我使用的是4.7并且还有EF 6.2,但大多数查询只使用上面的代码SqlCommands

enter image description here

1 个答案:

答案 0 :(得分:0)

确保您在连接字符串上使用的用户/登录名也可以访问Azure SQL数据库服务器上的主数据库,而不仅仅是用户数据库。这将提供更快的连接,超时可能会消失。

使用SQL Azure执行Estrategy可以帮助您解决此问题。

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

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

有关SQL Azure执行策略的详细信息,请访问this URL。