Configurar a lógica de retentativa do SqlClient com um ficheiro de configuração

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

Baixar ADO.NET

Utilize um ficheiro de configuração da aplicação para atribuir fornecedores de repetição predefinidos a todas as instâncias SqlConnection ou SqlCommand no processo. Sem estas secções ou uma atribuição de fornecedor ao nível do objeto, o SqlClient usa SqlConfigurableRetryFactory.CreateNoneRetryProvider e não tenta novamente.

Seções de configuração

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

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

Secção de ligação

Defina a lógica de retentativa predefinida para todas as instâncias de SqlConnection na aplicação, utilizando os seguintes atributos:

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

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

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

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

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

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

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

Observação

Não precisas de especificar retryLogicType quando usas um fornecedor integrado. Para os métodos disponíveis, veja Provedores de lógica de tentativa incorporados no SqlClient.

Secção de comandos

Defina a lógica de repetição predefinida para todas as instâncias de SqlCommand da aplicação, ao utilizar os atributos de connection-section e o seguinte atributo específico do comando:

  • authorizedSqlCondition: Define uma expressão regular que SqlCommand.CommandText deve corresponder antes de o fornecedor tentar novamente o comando. Se a expressão não coincidir, o comando é executado uma vez sem qualquer mecanismo de repetição.

Observação

A expressão regular é sensível a maiúsculas e minúsculas. Inclua uma opção inline, como (?i), quando precisar de correspondência insensível a maiúsculas e minúsculas.

Examples

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

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

    <SqlConfigurableRetryLogicCommand retryMethod ="CreateIncrementalRetryProvider"
                        numberOfTries ="4" deltaTime ="00:00:02" maxTime ="00:00:30"/>
    
  • Tentativas de executar um comando até oito vezes com um atraso de um segundo a um minuto. Está limitado a comandos com CommandText que contenha a palavra SELECT em maiúsculas e os códigos de erro 102 ou 997. Especificar transientErrors substitui a lista integrada, pelo que não serão efetuadas novas tentativas para quaisquer outros erros. 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 CreateCustomProvider método é definido na CustomCRL_Doc.CustomRetry classe no CustomCRL_Doc.dll assembly que está no diretório de execução do aplicativo.

  • Tenta estabelecer uma conexão até cinco vezes, com um atraso entre 3 e 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

O primeiro pedido para qualquer um dos padrões configurados faz com que o SqlClient carregue e armazene em cache tanto os fornecedores de ligação como os comandos. As alterações ao ficheiro de configuração não afetam nenhum dos fornecedores até o processo reiniciar.

Os erros ao ler as definições de repetição não fazem a aplicação falhar. O SqlClient rastreia o erro de configuração e usa SqlConfigurableRetryFactory.CreateNoneRetryProvider, para que as operações corram sem tentativas.

Utilize o rastreamento da origem dos eventos para verificar ou resolver problemas na configuração de novas tentativas. Para obter mais informações, consulte Habilitar rastreamento de eventos em SqlClient.