SQL Azure中的内部.Net Framework数据提供程序错误6

ASH*_*ASH 31 .net c# sql-server azure azure-sql-database

在创建与AzureSQL数据库的连接时,我经常遇到上述错误.我已经实现ReliableSqlConnection了重试逻辑以试图避免这个问题,但它一直无济于事.以下是错误堆栈跟踪示例:

System.InvalidOperationException
Internal .Net Framework Data Provider error 6. 
System.InvalidOperationException: Internal .Net Framework Data Provider error 6. 
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& connection)
at 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 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.ReliableSqlConnection.<Open>b__1()
at Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy.<>c__DisplayClass1.<ExecuteAction>b__0()
at Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func)
at Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy.ExecuteAction(Action action)
at Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.ReliableSqlConnection.<Open>b__0()
at Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy.<>c__DisplayClass1.<ExecuteAction>b__0()
at Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func)
at Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.RetryPolicy.ExecuteAction(Action action)
at Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.ReliableSqlConnection.Open(RetryPolicy retryPolicy)
Run Code Online (Sandbox Code Playgroud)

在弹性池中创建新数据库时会发生此问题.SQL命令文本在以下方法中执行:

public void ExecuteCommandText(string commandText)
    {
        if (IsNullOrEmpty(commandText))
            throw new ArgumentNullException(nameof(commandText));

        List<string> commandSteps = SplitCommandText(commandText);

        using (var sqlConnection = CreateConnection())
        {
            foreach (string commandStep in commandSteps)
            {
                using (SqlCommand command = sqlConnection.CreateCommand())
                {
                    command.CommandText = commandStep;
                    command.CommandTimeout = _commandTimeout;
                    command.ExecuteNonQuery();
                    command.Dispose();
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

哪里:

private ReliableSqlConnection CreateConnection()
    {
        if (IsNullOrEmpty(ConnectionString))
            throw new InvalidOperationException("Connection string is not defined.");

        ReliableSqlConnection sqlConnection = new ReliableSqlConnection(ConnectionString, _retryPolicy, _retryPolicy);
        sqlConnection.Open();
        return sqlConnection;
    }
Run Code Online (Sandbox Code Playgroud)

和:

var retryStrategy = new ExponentialBackoff(5, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(60), TimeSpan.FromSeconds(2));
_retryPolicy = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(retryStrategy);
Run Code Online (Sandbox Code Playgroud)

连接字符串的格式为:

$"Server=tcp:{serverName},1433;Data Source={serverName};Persist Security Info=False;User ID='{user}';Password='{password}';MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=90;"
Run Code Online (Sandbox Code Playgroud)

另外,我已经检查了eDTU弹性池的用法:

弹性池eDTU用法

第一个峰值是在池中创建1个数据库,第二个是2,第三个是3,第四个是同时创建4个数据库.弹性池服务层是标准100.

小智 5

这是 Azure SQL 暂时性错误之一。这里有很多信息https://msdn.microsoft.com/en-us/library/dn440719(v=pandp.60).aspx。尝试通过代码进行备份时似乎出现相同的错误。在这些情况下,我会放弃并重新开始。