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

时间:2017-02-03 15:03:40

标签: c# .net sql-server azure azure-sql-database

在创建与Azure SQL数据库的连接时,我经常遇到上述错误。我已经使用重试逻辑实现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)

在弹性池中创建新数据库时会发生此问题。 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();
                }
            }
        }
    }

其中:

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;
    }

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

连接字符串的格式为:

$"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;"

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

Elastic pool eDTU usage

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

1 个答案:

答案 0 :(得分:1)

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