Configure a lógica de nova tentativa do SqlClient com um arquivo de configuração

Aplica-se a: .NET Framework .NET .NET Standard

Baixar ADO.NET

Use um arquivo de configuração do aplicativo para atribuir provedores de nova tentativa padrão a cada instância SqlConnection ou SqlCommand no processo. Sem essas seções ou uma atribuição de provedor em nível de objeto, o SqlClient usa SqlConfigurableRetryFactory.CreateNoneRetryProvider e não tenta novamente.

Seções de configuração

Declare as seções de repetição dentro do elemento configSections. Declarações de seção devem aparecer antes dos valores de configuração correspondentes.

  • SqlConfigurableRetryLogicConnection: Define o provedor padrão para SqlConnection.
<section name="SqlConfigurableRetryLogicConnection"
        type="Microsoft.Data.SqlClient.SqlConfigurableRetryConnectionSection, Microsoft.Data.SqlClient"/>
  • SqlConfigurableRetryLogicCommand: Define o provedor padrão para SqlCommand.
<section name="SqlConfigurableRetryLogicCommand"
        type="Microsoft.Data.SqlClient.SqlConfigurableRetryCommandSection, Microsoft.Data.SqlClient"/>

Seção de conexão

Defina a lógica de nova tentativa padrão para todas as instâncias SqlConnection do aplicativo usando os seguintes atributos:

  • numberOfTries: Define o número total de tentativas, incluindo a operação inicial. A faixa válida é de 1 a 60.

  • deltaTime: Define o intervalo de tempo de gap como um objeto TimeSpan.

  • minTime: Define o intervalo mínimo de tempo permitido como um objeto TimeSpan.

  • maxTime: Define o intervalo máximo permitido de tempo de gap como um objeto TimeSpan.

  • transientErrors: Define uma lista separada por vírgulas de números de erro para tentar novamente. Se você omitir, o provedor usa a lista de erros transitórios embutida. Se você especificar, sua lista substitui a lista embutida.

  • retryMethod: Especifica um criador de método de retry que recebe a configuração de retry por meio de um SqlRetryLogicOption parâmetro e retorna um SqlRetryLogicBaseProvider objeto.

  • retryLogicType: Define um provedor de lógica de retry personalizado que contém os criadores de métodos de retry identificados por retryMethod. Esses métodos devem atender aos critérios para retryMethod. Use o nome de tipo totalmente qualificado do provedor. Para obter mais informações, confira Especificando nomes de tipo totalmente qualificados.

Observação

Você não precisa especificar retryLogicType quando usa um provedor embutido. Para os métodos disponíveis, veja Provedores de lógica de tentativa embutidos no SqlClient.

Seção de comando

Defina a lógica de repetição padrão para todas as instâncias SqlCommand na aplicação usando os atributos da seção de conexão e o seguinte atributo específico do comando:

  • authorizedSqlCondition: Define uma expressão regular que SqlCommand.CommandText deve corresponder antes que o provedor tente novamente o comando. Se a expressão não coincidir, o comando é executado uma vez, sem lógica de nova tentativa.

Observação

A expressão regular é sensível a maiúsculas e minúsculas. Inclua uma opção em linha, como (?i), quando você precisa de correspondência diferenciando maiúsculas de minúsculas.

Exemplos

  • Tenta até três vezes estabelecer uma conexão, com um atraso aproximado de 1 segundo entre as tentativas, usando o método SqlConfigurableRetryFactory.CreateFixedRetryProvider e a lista de erros transitórios padrão:

    <SqlConfigurableRetryLogicConnection retryMethod ="CreateFixedRetryProvider"
                                            numberOfTries ="3" deltaTime ="00:00:01"/>
    
  • Tenta até cinco vezes estabelecer uma conexão, com um atraso de até 45 segundos entre as tentativas, usando o método SqlConfigurableRetryFactory.CreateExponentialRetryProvider e a lista de erros transitórios padrão:

    <SqlConfigurableRetryLogicConnection retryMethod ="CreateExponentialRetryProvider"
                        numberOfTries ="5" deltaTime ="00:00:03" maxTime ="00:00:45"/>
    
  • Tenta executar um comando até quatro vezes com um atraso de 2 a 30 segundos usando o método SqlConfigurableRetryFactory.CreateIncrementalRetryProvider e a lista de erros transitórios padrão:

    <SqlConfigurableRetryLogicCommand retryMethod ="CreateIncrementalRetryProvider"
                        numberOfTries ="4" deltaTime ="00:00:02" maxTime ="00:00:30"/>
    
  • Tenta executar um comando até oito vezes com um atraso de um segundo a um minuto. É limitado aos comandos com CommandText contendo a palavra SELECT em maiúsculas e os números de erro 102 ou 997. A especificação de transientErrors substitui a lista integrada, logo, nenhum outro erro é tentado novamente. O exemplo a seguir usa SqlConfigurableRetryFactory.CreateIncrementalRetryProvider:

    <SqlConfigurableRetryLogicCommand retryMethod ="CreateIncrementalRetryProvider"
                            numberOfTries ="8" deltaTime ="00:00:01" maxTime ="00:01:00"
                            transientErrors="102, 997"
                            authorizedSqlCondition="\b(SELECT)\b"/>
    

Observação

Nos próximos dois exemplos, você pode encontrar o código-fonte da lógica de repetição personalizada das APIs principais da lógica de repetição configurável no SqlClient. Supõe-se que o método CreateCustomProvider esteja definido na classe CustomCRL_Doc.CustomRetry no assembly CustomCRL_Doc.dll que está no diretório em execução do aplicativo.

  • Tenta estabelecer uma conexão até cinco vezes, com um atraso de 3 a 45 segundos, números de erro 4060, 997 e 233 na lista e usando o provedor de repetição personalizado especificado:

    <SqlConfigurableRetryLogicConnection retryLogicType ="CustomCRL_Doc.CustomRetry, CustomCRL_Doc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
                        retryMethod ="CreateCustomProvider"
                        numberOfTries ="5" deltaTime ="00:00:03" maxTime ="00:00:45"
                        transientErrors ="4060, 997, 233"/>
    
  • Este exemplo se comporta como o anterior:

    <SqlConfigurableRetryLogicConnection retryLogicType ="CustomCRL_Doc.CustomRetry, CustomCRL_Doc"
                        retryMethod ="CreateCustomProvider"
                        numberOfTries ="5" deltaTime ="00:00:03" maxTime ="00:00:45"
                        transientErrors ="4060, 997, 233"/>
    

Importante

A primeira solicitação para qualquer um dos padrões configurados faz com que o SqlClient carregue e armazene em cache tanto os provedores de conexão quanto de comandos. Alterações no arquivo de configuração não afetam nenhum dos provedores até que o processo seja reiniciado.

Erros durante a leitura das configurações da nova tentativa não fazem o aplicativo falhar. O SqlClient rastreia o erro de configuração e usa SqlConfigurableRetryFactory.CreateNoneRetryProvider, então as operações rodam sem retentações.

Use o rastreamento da origem dos eventos para verificar ou solucionar problemas na configuração de repetição. Para obter mais informações, confira Habilitar o rastreamento de eventos no SqlClient.