Je rencontre régulièrement l'erreur ci-dessus lors de la création de connexions aux bases de données SQL Azure
. J'ai implémenté ReliableSqlConnection
avec une logique de nouvelle tentative pour éviter ce problème, mais cela n'a pas été possible. Voici un exemple de trace de pile d'erreur:
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)
Ce problème se produit lors de la création d'une nouvelle base de données dans un pool élastique. Le texte de la commande SQL s'exécute selon la méthode suivante:
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();
}
}
}
}
Où:
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;
}
Et:
var retryStrategy = new ExponentialBackoff(5, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(60), TimeSpan.FromSeconds(2));
_retryPolicy = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(retryStrategy);
La chaîne de connexion est au format:
$"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;"
J'ai également vérifié l'utilisation de eDTU
sur mon pool élastique:
tilisation de l'eDTU du pool élastique
Le premier pic provient de la création d'une base de données dans le pool, le second de 2, le troisième de 3 et le quatrième de la création simultanée de 4 bases de données. Le niveau de service de piscine élastique est Standard 100.
Il s'agit de l'une des erreurs transitoires Azure SQL. Beaucoup d'informations sont ici https://msdn.Microsoft.com/en-us/library/dn440719 (v = pandp.60) .aspx . Semble la même erreur lors de la tentative de sauvegarde via le code. Dans ces cas, je laisse tomber et reprends.