Configura la logica dei ritenti in SqlClient

Si applica a: .NET Framework .NET .NET Standard

Scarica ADO.NET

Questo articolo mostra come creare un provider per tentativi esponenziali e assegnarlo a un SqlConnection. Il provider riprova la connessione in presenza dell'elenco integrato del driver degli errori di connessione temporanei e tenta di aprirla fino a cinque volte.

Prerequisiti

  • Microsoft. Data.SqlClient 3.0 o una versione successiva.
  • Una stringa di connessione per SQL Server, database SQL di Azure, Istanza gestita di SQL di Azure o un database SQL in Microsoft Fabric.

Configura un provider di ritentativi di connessione

  1. Definisci le opzioni per i nuovi tentativi. Lascia TransientErrors come null in modo che il provider usi la lista di errori transitori integrata.

    // 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. Crea un fornitore tra le opzioni.

    // Create a retry logic provider
    SqlRetryLogicBaseProvider provider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(options);
    
  3. Assegna il fornitore prima di aprire la connessione.

    // 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 consente un primo tentativo e fino a quattro tentativi. Il fornitore esponenziale aumenta l'intervallo tra i tentativi e aggiunge jitter casuale. MaxTimeInterval limita ogni singolo ritardo, non il tempo totale trascorso per tutti i tentativi.

Configura i nuovi tentativi dei comandi

Crea un fornitore separato e assegnalo a SqlCommand.RetryLogicProvider. Imposta SqlRetryLogicOption.AuthorizedSqlCondition su un predicato che restituisce true solo i comandi che la tua applicazione può ripetere in sicurezza.

Caution

Un provider integrato non ritenta un comando quando la connessione ha una transazione attiva. Se un fallimento transitorio invalida una transazione, annulla e riprova l'intera transazione. Non riprovare solo con l'affermazione fallita.

L'impostazione SqlRetryLogicOption.TransientErrors sostituisce l'elenco degli errori integrato del driver. Per estendere la base senza perdere i valori predefiniti, vedi Estendi la lista di errori transitori integrati.