Configurer la logique de réessayage dans SqlClient

S’applique à : .NET Framework .NET Standard

Télécharger ADO.NET

Cet article explique comment créer un fournisseur de nouvelles tentatives exponentielles et l’associer à un SqlConnection. Le fournisseur passe en revue la liste intégrée au pilote des erreurs de connexion temporaires et tente d'ouvrir la connexion jusqu'à cinq fois.

Prerequisites

  • Microsoft. Data.SqlClient 3.0 ou une version ultérieure.
  • Une chaîne de connexion pour SQL Server, Azure SQL Database, Azure SQL Managed Instance, ou une base de données SQL dans Microsoft Fabric.

Configurez un fournisseur de réessayage de connexion

  1. Définissez les options de réessayage. Laissez TransientErrors comme null pour que le fournisseur utilise la liste d’erreurs transitoires intégrée.

    // Define the retry logic parameters
    var options = new SqlRetryLogicOption()
    {
        // Tries 5 times before throwing an exception
        NumberOfTries = 5,
        // Preferred gap time to delay before retry
        DeltaTime = TimeSpan.FromSeconds(1),
        // Maximum gap time for each delay time before retry
        MaxTimeInterval = TimeSpan.FromSeconds(20)
    };
    
  2. Créez un prestataire parmi les options.

    // Create a retry logic provider
    SqlRetryLogicBaseProvider provider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(options);
    
  3. Assignez le fournisseur avant d’ouvrir la connexion.

    // Assumes that connection is a valid SqlConnection object 
    // Set the retry logic provider on the connection instance
    connection.RetryLogicProvider = provider;
    // Establishing the connection will retry if a transient failure occurs.
    connection.Open();
    

NumberOfTries = 5 permet une première tentative et jusqu’à quatre tentatives. Le fournisseur exponentiel augmente l’intervalle entre les tentatives et ajoute un jitter aléatoire. MaxTimeInterval plafonne chaque délai individuel, pas le temps total écoulé pour toutes les tentatives.

Configurer les tentatives de nouvelle exécution de la commande

Créez un fournisseur séparé et assignez-le à SqlCommand.RetryLogicProvider. Réglez SqlRetryLogicOption.AuthorizedSqlCondition sur un prédicat qui ne retourne true que pour les commandes que votre application peut répéter en toute sécurité.

Avertissement

Un fournisseur intégré ne réessaie pas une commande lorsque la connexion a une transaction active. Si une défaillance transitoire invalide une transaction, revenez en arrière et réessayez l’intégralité de la transaction. Ne recommencez pas seulement l’énoncé qui échoue.

Le réglage SqlRetryLogicOption.TransientErrors remplace la liste d’erreurs intégrée du pilote. Pour étendre la ligne de base sans perdre les paramètres par défaut, voir Étendre la liste d’erreurs transitoires intégrée.