Sql Azure的短暂错误

时间:2016-01-19 17:52:57

标签: entity-framework azure-sql-database

我们已经获得了以下数据库配置设置,但是在针对SQL Azure(P1层)进行操作时,我们仍然会看到大量的瞬态错误通知。


public class DbConfiguration : System.Data.Entity.DbConfiguration
{    public DbConfiguration()
   {
       SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy(5, TimeSpan.Parse("00:00:03"));
   }
}

任何熟悉此事的人都可以对我们可能设置错误的任何内容发表评论吗?我们正在使用EF6。

我们得到的确切例外是:

  

可能由于瞬时故障而引发异常。如果要连接到SQL Azure数据库,请考虑使用SqlAzureExecutionStrategy。           异常完整值:System.Data.Entity.Core.EntityException:引发了一个异常,可能是由于瞬态故障引起的。如果要连接到SQL Azure数据库,请考虑使用SqlAzureExecutionStrategy。 ---&GT; System.Data.Entity.Core.EntityException:基础提供程序在Open上失败。 ---&GT; System.Data.Entity.Core.EntityException:引发了一个异常,可能是由于瞬态故障引起的。如果要连接到SQL Azure数据库,请考虑使用SqlAzureExecutionStrategy。 ---&GT; System.Data.SqlClient.SqlException:与服务器成功建立连接,但在登录过程中发生错误。 (提供者:TCP提供者,错误:0 - 远程主机强行关闭现有连接。)---&gt; System.ComponentModel.Win32Exception:远程主机强制关闭现有连接           ---内部异常堆栈跟踪结束---           at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception,Boolean breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync() at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket() at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer() at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData) at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource 1 retry,DbConnectionOptions userOptions,DbConnectionInternal&amp; connection)           在System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection,TaskCompletionSource 1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource 1重试,DbConnectionOptions userOptions)           在System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource 1 retry) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource 1重试)           在System.Data.SqlClient.SqlConnection.Open()           在System.Data.Entity.Infrastructure.Interception.InternalDispatcher 1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action 2操作,TInterceptionContext interceptionContext,Action 3 executing, Action 3执行)           在System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection连接,DbInterceptionContext interceptionContext)           在System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy。&lt;&gt; c__DisplayClass1.b__0()           在System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute [TResult](Func 1 operation) --- End of inner exception stack trace --- at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func 1操作)           在System.Data.Entity.Core.EntityClient.EntityConnection.Open()           ---内部异常堆栈跟踪结束---           在System.Data.Entity.Core.EntityClient.EntityConnection.Open()           在System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(Boolean shouldMonitorTransactions)           在System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction [T](Func 1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass47 1.b__45()           在System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute [TResult](Func 1 operation) --- End of inner exception stack trace --- at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func 1操作)           at System.Data.Entity.Core.Objects.ObjectContext.ExecuteFunction [TElement](String functionName,ExecutionOptions executionOptions,ObjectParameter [] parameters)

3 个答案:

答案 0 :(得分:1)

由于以下原因(不是详细列表......),Azure中会发生暂时性错误。

1.您的数据库负载很重(使用全部/达到dtu配额)

在DMV下方使用以查看DTU指标

SELECT 
    (COUNT(end_time) - SUM(CASE WHEN avg_cpu_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'CPU Fit Percent'
    ,(COUNT(end_time) - SUM(CASE WHEN avg_log_write_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Log Write Fit Percent'
    ,(COUNT(end_time) - SUM(CASE WHEN avg_data_io_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Physical Data Read Fit Percent'
FROM sys.dm_db_resource_stats

2.如果您看到DTU在瞬态故障时的使用是正常的,但仍然看到错误,那么很高兴看看是否有可能进行优化。我们曾经有相同的故障,我们优化了sql代码和做了索引重建和统计

3.使用失败的时间戳访问Azure支持,以查看是否存在任何维护活动

答案 1 :(得分:0)

看起来你在实体框架中使用'SqlAzureExecutionStrategy',而实体框架又调用具有指数退避的'DbExecutionStrategy'作为内置机制。这会导致更大的延迟,我建议如下: 1)5.5秒后线性重试是理想的。客户端缓存错误消息5秒,因此即使您在此时间段内重试,它也只会向您发送缓存的消息。 2)建议的超时为30秒。 3)我也强烈推荐连接池,详情如下: https://msdn.microsoft.com/library/8xx3tyca.aspx

如果可能的话,还可以通过dmalik@Microsoft.com向我发送服务器名称和数据库名称,以及停机和频率的持续时间吗?

答案 2 :(得分:0)

经过研究,我发现它与Azure SQL数据库最大登录数的限制有关。我使用的是“ 基本”服务轮胎,最多可同时登录30个用户。

Azure的定价层在性能上有很大的不同。为此,他们限制了许多性能指标,例如CPU功率,每分钟请求数等。

这意味着,如果您要遍历您的层,则请求将开始排队,因为CPU功率/请求量太高而无法处理。这导致超时,然后随着请求等待处理,请求限制增加。最终,它到达了数据库实质上崩溃的地步。

我的经验是,较低的数据库级别(例如S0和S1)的功能不足,除开发或非常基本的站点外,不应将其用于其他任何用途。

Azure门户中有一些很棒的工具,可让您调试数据库中发生的事情,例如CPU图,索引顾问和查询性能见解。

*以下是相关链接:*

如果可以解决问题,则需要在Azure中升级订阅。或如此处所述启用执行策略:https://msdn.microsoft.com/en-us/data/dn456835.aspx

希望这会有所帮助!

谢谢。