Je fais régulièrement l'expérience de l'erreur ci-dessus lors de la création de connexions Azure
bases de données SQL. J'ai implémenté ReliableSqlConnection
avec logique de nouvelle tentative dans une tentative pour éviter ce problème, mais il a été en vain. Voici un exemple d'erreur trace de la pile:
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 élastique à la piscine. Le texte de la commande SQL est d'exécuter 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 de la forme:
$"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;"
Aussi, j'ai vérifié l' eDTU
d'utilisation sur mon élastique de la piscine:
Élastique piscine eDTU utilisation
Le premier pic est de créer de 1 de la base de données dans la piscine, la seconde est pour les 2, le troisième est pour la 3 et la quatrième est pour la création de 4 bases de données simultanément. L'élastique à la piscine de niveau de service Standard est de 100.