在创建与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
用法:
第一个峰值是在池中创建1个数据库,第二个是2,第三个是3,第四个是同时创建4个数据库。弹性池服务层是标准100。
答案 0 :(得分:1)
这是Azure SQL瞬态错误之一。这里有很多信息https://msdn.microsoft.com/en-us/library/dn440719(v=pandp.60).aspx。尝试通过代码进行备份时出现相同的错误。在那些情况下,我放弃并重新启动。