Lógica de repetição configurável (JDBC)

Baixar JDBC Driver

A lógica de repetição configurável (CRL) é um mecanismo baseado em regras que repete automaticamente instruções que falharam ou tentativas iniciais de conexão com base nos números de erro do SQL Server que você escolher, com parâmetros de temporização que você controla. A CRL foi introduzida no Microsoft JDBC Driver 12.10 para SQL Server.

CRL é separada da resiliência de conexão inativa e das propriedades connectRetryCount / connectRetryInterval. A resiliência em inatividade recupera de forma transparente conexões interrompidas, e connectRetryCount tenta novamente a autenticação inicial em intervalos fixos para uma lista incorporada de erros transitórios. A CRL permite que você decida quais erros são repetíveis, quantas vezes e quanto tempo aguardar entre as tentativas. Você pode usar os três mecanismos juntos.

Quais novas tentativas de CRL

A CRL lida com dois cenários distintos, cada um controlado por sua própria propriedade de conexão:

Scenario Propriedade Quando a nova tentativa for executada Disparado por
Falha na execução da instrução retryExec Durante a execução de uma instrução (por exemplo, executeQuery, executeUpdate, execute ou a execução em lote) Um SQLServerException cujo número de erro corresponde a uma regra de instrução configurada
Falha inicial de conexão ou autenticação retryConn Dentro do loop de nova tentativa de conexão do driver (que é controlado por connectRetryCount e loginTimeout) Um SQLServerException durante a autenticação, cujo número de erro corresponde a uma regra de conexão configurada ou, por padrão, qualquer erro transitório já coberto pela lista interna de novas tentativas

Para instruções, o driver tenta novamente apenas o comando que falhou. O driver não reinicializa o estado atual da transação, portanto, defina suas regras considerando erros que mantêm a sessão utilizável, como vítima de deadlock (1205) ou tempo limite de bloqueio (1222).

Para conexões, a CRL complementa ou substitui a lista interna do driver de erros transitórios de conexão. Consulte as regras de nova tentativa de conexão para a semântica do prefixo +.

Habilitar CRL

A CRL tem duas camadas:

  1. A camada de repetição de conexão é ativada por padrão: desde que connectRetryCount > 0 (o padrão é 1), o driver tenta novamente a lista interna de erros transitórios de conexão.
  2. A camada de personalização (sua própria retryExec e retryConn regras) está desativada por padrão. Ambas as propriedades são cadeias de caracteres vazias, a menos que você as defina. Você pode defini-los por meio da URL JDBC, um Properties objeto ou um SQLServerDataSource. O driver remove os wrappers opcionais {...} em todas as três formas.

Os trechos de Java neste artigo omitem importações e declarações de classe por questões de brevidade.

Na URL JDBC

Cada regra (ou toda a lista de regras) deve ser encapsulada em chaves ({...}) porque a URL JDBC usa ; como separador:

jdbc:sqlserver://server;databaseName=db;retryExec={1205,1222:3,2*2:select,update}
jdbc:sqlserver://server;databaseName=db;retryConn={+<customErrorNumber>}

Com um objeto Properties

Properties props = new Properties();
props.setProperty("user", "...");
props.setProperty("password", "...");
props.setProperty("retryExec", "1205,1222:3,2*2:select,update");
props.setProperty("retryConn", "+<customErrorNumber>");
Connection c = DriverManager.getConnection("jdbc:sqlserver://server;databaseName=db", props);

Com SQLServerDataSource

Os mesmos setters existem na ISQLServerDataSource interface:

SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("server");
ds.setDatabaseName("db");
ds.setRetryExec("1205,1222:3,2*2:select,update");
ds.setRetryConn("+<customErrorNumber>");

Sintaxe de regra

Uma única regra tem até três seções separadas por dois-pontos:

<errorNumbers> : <retryTimings> : <queryFilter>
Seção Obrigatório? Meaning
errorNumbers Yes Um SQL Server número de erro ou vários separados por vírgulas (por exemplo, 1205 ou 1205,1222). Para regras de conexão, um líder opcional + controla se os erros transitórios existentes são mantidos.
retryTimings Necessário para regras de declaração. Omita para regras de conexão. retryCount[,initialRetryTime[<op>retryChange]] onde <op> é + (aditivo) ou * (multiplicativo).
queryFilter Opcional, somente para regras de declaração Lista separada por vírgulas de palavras-chave SQL. O driver converte o valor para minúsculas durante a análise e converte a instrução SQL executada anteriormente para minúsculas em tempo de execução. A regra dispara quando a lista de filtros combinada contém o primeiro token da instrução SQL executada. Omita a terceira seção para desabilitar a filtragem.

Para usar várias regras na mesma propriedade, separe-as com ; e coloque cada regra entre {...} ao inseri-las em uma URL JDBC.

Parâmetros de tempo

Para uma regra de declaração com temporizações retryCount, initialRetryTime <op> retryChange:

  • retryCount: o número de tentativas adicionais que o driver faz após a primeira falha. Um valor de 0 desabilita nova tentativa. Valores negativos são inválidos.
  • initialRetryTime: o número de segundos a aguardar antes da primeira repetição. O valor padrão é 0.
  • <op>: o operador, que pode ser + ou *. O valor padrão é +.
  • retryChange: o valor aplicado para calcular os tempos de espera subsequentes. O valor padrão é 2. Quando o operando é * e retryChange é omitido da regra, o driver define retryChange = initialRetryTime.

Importante

Se você fornecer initialRetryTime sem um operando explícito (por exemplo, 3,5), o driver usará os valores padrão para o operando e retryChange (+ e 2). As esperas não são constantes. Eles crescem em 2 a cada nova tentativa. Para obter uma espera constante, use o formulário retryCount,N+0 explícito (por exemplo, 3,5+0).

O driver calcula o tempo de espera da tentativa i (indexada em 0) durante a análise:

Operando Aguarde pela tentativa i
+ (aditivo) initialRetryTime + (retryChange * i)
* (multiplicativo) initialRetryTime * (retryChange ^ i)

Exemplos de cadeias de tempo:

String retryCount initialRetryTime operando tentarNovamenteAlteração Sequência de espera (segundos)
3 3 0 (padrão) + (padrão) 2 (padrão) 0, 2, 4
3,5 3 5 + (padrão) 2 (padrão) 5, 7, 9
3,5+5 3 5 + 5 5, 10, 15
3,2*2 3 2 * 2 2, 4, 8
4,1* 4 1 * 1 (é igual a initialRetryTime porque o operando é * e retryChange foi omitido) 1, 1, 1, 1

Uma retryTimings seção pode conter no máximo uma vírgula. Mais de uma vírgula gera R_invalidParameterNumber.

Regras de nova tentativa da instrução (retryExec)

As regras de instrução tentam novamente a execução da instrução com falha. Quando uma instrução lança um SQLServerException, o driver:

  1. Procura o número do erro que causou a falha no conjunto de regras da instrução analisada.
  2. Se existir uma regra e a contagem de tentativas atual for menor do que retryCount, opcionalmente, verificará o ÚLTIMO SQL executado em relação ao da queryFilterregra.
  3. Se tudo estiver de acordo, o driver aguardará waitTimes[retryAttempt] segundos (sujeito a queryTimeout; consulte Interação com queryTimeout e connectRetryCount) e executará a instrução novamente.
  4. Se nenhuma regra corresponder, o driver lançará novamente a exceção.

Formato (declarações)

{errorNumber(s):retryCount[,initialRetryTime[<op>retryChange]][:queryFilter]}

As regras de declaração devem incluir uma seção de temporização. retryCount é obrigatório. Uma regra que contém apenas um número de erro é interpretada como uma regra de conexão, portanto, em instruções, sempre forneça pelo menos retryCount.

Exemplos (instruções)

Regra Efeito
{1205:3} Tentar novamente a vítima de deadlock (1205) até 3 vezes, sem espera entre as tentativas.
{1205,1222:3,5+5} Tente novamente a vítima de deadlock e bloqueie o tempo limite até 3 vezes, aguardando 5, 10 e 15 segundos.
{2714:2,1*2} Repetir "o objeto já existe" até 2 vezes, aguardando 1 e 2 segundos.
{1205:4,2+2:select,update} Tente novamente somente quando a instrução com falha começar com select ou update.
{1205:3,5+5};{1222:2,2} Duas regras independentes, separadas por ;.

Listar vários números de erro (por exemplo, 1205,1222) é abreviação. O driver expande a regra para uma entrada por erro, todas compartilhando a mesma temporização e o mesmo filtro de consulta.

Regras de repetição de conexão (retryConn)

As regras de conexão funcionam com o loop existente de tentativas de reconexão. Esse loop só está ativo quando connectRetryCount > 0 (o padrão é 1). O loop já tenta novamente uma lista interna de erros transitórios de conexão com connectRetryInterval segundos de diferença, até connectRetryCount tentativas extras e é limitado por loginTimeout.

Uma regra de conexão fornece apenas uma seção de número de erro. Ele não tem intervalos ou filtro de consulta:

{[+]errorNumber(s)}
  • Sem +, as regras configuradas substituem a lista de erros transitórios interna. Somente os erros listados são repetidos.
  • Com + (por exemplo, {+4060}), as regras configuradas são adicionadas à lista interna. Tanto os seus erros quanto as configurações padrão do driver são tentados novamente.

O modo de substituir ou acrescentar é global para todo o valor retryConn. Se qualquer regra nesse valor omitir +, o driver passa para o modo de substituição para todas as regras nesse valor. Por exemplo, retryConn={+4060};{40143} não acrescenta 4060 e 40143 à lista interna. A regra 40143 omite +, portanto a lista interna é descartada e apenas 4060 e 40143 são tentadas novamente. Para acrescentar ambos, gravar retryConn={+4060};{+40143} (ou retryConn={+4060,40143}).

O loop de conexão continua usando connectRetryInterval e connectRetryCount para cadenciamento e delimitação. A regra de CRL expande ou substitui o conjunto de erros elegíveis para nova tentativa.

Exemplos (conexões)

Regra Efeito
{+<customErrorNumber>} Adicione um número de erro personalizado à lista de erros transitórios interna.
{+<customError1>,<customError2>} Adicione vários números de erro personalizados à lista de erros transitórios internos.
{4060} Tente novamente somente em caso de erro 4060. Erros transitórios integrados não são mais submetidos a nova tentativa pela CRL.

Note

retryConn não muda loginTimeout a semântica. O loop existente de repetição da conexão ainda impõe um limite ao tempo total decorrido e desiste antecipadamente se o próximo connectRetryInterval fizer com que o tempo decorrido ultrapasse loginTimeout.

Lista integrada de erros transitórios de conexão

O loop de nova tentativa de conexão já repete os seguintes erros sem qualquer configuração de CRL, contanto que connectRetryCount > 0. Listar qualquer desses erros em uma regra retryConn com + não tem efeito (eles já estão abordados). Use uma regra retryConn quando precisar adicionar um erro que não está nesta lista ou quando precisar descartar a lista por completo usando a forma sem + substituição.

Note

Você não precisa adicionar erros comuns de conexão transitória do SQL do Azure, como 40197, 40501, 40613, 49918, 49919 ou 49920. A lista interna já os tenta novamente.

Erro Message Troubleshooting
64 Uma conexão com o servidor foi estabelecida com êxito, mas ocorreu um erro durante o processo de logon. (provedor: Provedor TCP, erro: 0 – O nome da rede especificado não está mais disponível.) A conexão TCP foi interrompida durante o handshake. Não é uma falha de credenciais. Se persistir, verifique se há instabilidade na rede do cliente, falhas nos recursos de offload da placa de rede ou algum dispositivo intermediário que descarte conexões parcialmente estabelecidas.
233 O cliente não pôde estabelecer uma conexão devido a um erro durante o processo de inicialização da conexão antes do logon. Transporte de pré-logon ou falha do TLS. O servidor normalmente retorna isso quando não pode aceitar a conexão (esgotamento de recursos, conexões máximas alcançadas ou um cliente sem suporte). Não é uma falha de credenciais. Verifique a integridade do servidor e, em seguida, verifique loginTimeout, as configurações de TLS e a compatibilidade entre as versões de TLS do cliente e do servidor.
4060 Não é possível abrir o banco de dados database_name solicitado pelo logon. O login falhou. O logon foi autenticado, mas não pôde abrir o banco de dados solicitado. As causas transitórias incluem o fato de o banco de dados estar em transição (failover, restauração, aumento de escala) ou pausado automaticamente. As causas persistentes (o banco de dados não existe, o logon não tem acesso) não serão corrigidas por repetição; verifique o nome do banco de dados, o mapeamento de logon e o estado do banco de dados.
4221 O login no servidor secundário de leitura falhou por causa do longo tempo de espera em HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING. A réplica secundária legível não pôde aceitar o login porque as versões de linha ainda estão ausentes das transações em andamento depois que a réplica foi reciclada. Atenuar evitando transações de gravação longa no primário; a repetição normalmente é bem-sucedida quando o primário confirma ou reverte as transações abertas.
10053 Ocorreu um erro de nível de transporte ao enviar a solicitação ao servidor. (provedor: Provedor TCP, erro: 0 – uma conexão estabelecida foi anulada pelo software em seu computador host.) O lado local interrompeu a conexão (Windows Sockets WSAECONNABORTED). Geralmente, uma falha de keepalive ou o encerramento, pela pilha de rede local, de uma conexão ociosa ou semiaberta. Verifique a integridade da rede do lado do cliente, os temporizadores keepalive do sistema operacional e qualquer firewall local ou cliente VPN.
10054 Ocorreu um erro de nível de transporte ao enviar a solicitação ao servidor. (provedor: Provedor TCP, erro: 0 - Uma conexão existente foi fechada à força pelo host remoto.) O lado remoto enviou uma redefinição de TCP (Windows Sockets WSAECONNRESET). Causas comuns: o processo par falhou, um firewall injetou uma redefinição ou o gateway do SQL do Azure fechou uma conexão ociosa. Para padrões de redefinição por inatividade, habilite o keepalive TCP no cliente ou reduza o tempo limite de inatividade do pool de conexões.
10928 ID do recurso: N. O limite de tipo de limite para o banco de dados é N e foi atingido. Consulte sys.dm_exec_sessions para obter instruções de uso. Um limite de governança de recursos no banco de dados foi atingido (sessões, trabalhos ou solicitações). Identifique o tipo de limite na mensagem e, em seguida, reduza a concorrência, aumente a capacidade do banco de dados ou encurte as operações de longa duração que mantêm o recurso ocupado.
10929 ID do recurso: N. A garantia mínima do tipo limite é N, o limite máximo é N e o uso atual do banco de dados é N. No entanto, no momento, o servidor está muito ocupado para dar suporte a solicitações maiores que N para esse banco de dados. O banco de dados está acima de sua garantia mínima e o servidor subjacente está limitando. Normalmente, a repetição é bem-sucedida quando a carga do vizinho cai. Ocorrências sustentadas indicam que você precisa de uma camada de serviço mais alta ou um ambiente menos barulhento.
40020
40143
40166
40540
Relatado no slot Error code %d do erro 40197 durante o failover. Subcódigos incorporados em uma mensagem de failover 40197 que alguns caminhos expõem como o número de erro de nível superior. O driver lista cada um individualmente para que ele tente novamente em qualquer um dos formulários. Trate-os da mesma forma que 40197.
40197 O serviço encontrou um erro ao processar sua solicitação. Tente novamente. Código de erro N. Uma atualização de software, uma falha de hardware ou outro evento de failover no SQL do Azure. Reconectar redireciona você para uma réplica íntegra. O código de erro inserido identifica o tipo de failover. Ocorrências persistentes devem ser relatadas com a ID de rastreamento de sessão.
40501 O serviço está ocupado. Repita a solicitação depois de 10 segundos. ID do incidente: guid. Código: N. Limitação do mecanismo do SQL do Azure. O mínimo recomendado é um intervalo de espera de 10 segundos. A limitação contínua indica que você excedeu o limite de DTU/vCore; escale verticalmente ou reduza a concorrência.
40613 O banco de dados database_name no servidor server_name não está disponível no momento. Tente a conexão novamente mais tarde. Se o problema persistir, entre em contato com o suporte ao cliente e forneça a ID de rastreamento de sessão do guid. O banco de dados não está disponível, geralmente durante um failover ou por um breve período durante uma operação de escala. Tente novamente após um intervalo de espera; se o problema persistir por alguns minutos, capture a ID de rastreamento da sessão e abra um chamado de suporte.
42108 Não é possível se conectar ao pool de SQL, pois ele está em pausa. Reative o pool SQL e tente novamente. O pool de SQL dedicado (Synapse) está em pausa. Só tente novamente se algo reativar o pool em paralelo. Retome o pool explicitamente ou agende a carga de trabalho após a retomada.
42109 O pool de SQL está sendo preparado. Tente novamente. O pool de SQL dedicado está sendo reiniciado. Tente novamente com um intervalo de espera progressivo até ficar online; a inicialização normalmente leva alguns minutos.
49918 Não é possível processar a solicitação. Não há recursos suficientes para processar a solicitação. O plano de controle não pôde alocar recursos para a solicitação no momento. Tente novamente em uma retirada. Ocorrências persistentes indicam pressão de capacidade regional.
49919 Não foi possível criar ou atualizar a solicitação. Há muitas operações de criação ou atualização em andamento para a assinatura N. Limite de concorrência no nível da assinatura para operações de gerenciamento. Reduza chamadas paralelas de criação/atualização ou escalone-as.
49920 Não é possível processar a solicitação. Muitas operações em andamento para assinatura N. Limite de concorrência no nível de assinatura em operações em pré-lançamento. Reduza o paralelismo ou aguarde até que as operações de pré-lançamento sejam concluídas.

A lista canônica do driver é a TransientError enum em SQLServerError.java. O texto da mensagem de erro vem de erros transitórios de conexão do SQL do Azure. Os erros no nível de instrução (como o erro 1205 de vítima de deadlock ou o erro 1222 de tempo limite de solicitação de bloqueio) não estão nesta lista, porque o loop de nova tentativa de conexão só é executado durante a conexão inicial. Para repetir esses erros, use uma retryExec regra.

Carregar regras de um arquivo de propriedades

Se você não definir retryExec ou retryConn na conexão, o CRL procurará um arquivo chamado mssql-jdbc.properties ao lado do JAR do driver no classpath. O arquivo usa análise sintática básica key=value. Linhas que começam com retryExec= ou retryConn= são identificadas. Os valores usam a mesma sintaxe descrita neste artigo, com ; separando várias regras.

Use nomes de chave exatos (retryExec e retryConn), sem espaço em branco à esquerda. O arquivo não é analisado como um arquivo de propriedades de Java completo. O driver faz uma verificação literal startsWith em cada linha, portanto:

  • As linhas que começam com # ou qualquer outro nãoretryExec/retryConn prefixo são ignoradas.
  • As linhas cuja chave só começa com retryExec ou retryConn (por exemplo, retryExec2=...) são tratadas como a propriedade correspondente e podem produzir erros de análise. Não introduza variantes personalizadas.

Exemplo mssql-jdbc.properties:

retryExec=1205:3,5+5;1222:2,2
retryConn=+4060,40143

Se o arquivo não for encontrado, a CRL registrará uma mensagem FINE no logger com.microsoft.sqlserver.jdbc.ConfigurableRetryLogic e continuará sem regras. O caminho do arquivo usado para a pesquisa está incluído nessa mensagem de log.

Os valores da cadeia de conexão têm precedência. Se retryExec ou retryConn não estiverem vazios na conexão, o driver não consultará o arquivo para essa propriedade.

Comportamento de atualização de regra

A CRL mantém um único conjunto de regras em toda a JVM. Após a construção, o driver atualizará as regras lentamente:

  • O driver avalia as oportunidades de atualização durante a execução da instrução e as novas tentativas de conexão.
  • Uma atualização só ocorre após 30 segundos decorridos desde a leitura anterior.
  • Se as regras vieram originalmente de mssql-jdbc.properties, o driver comparará o carimbo de data/hora da última modificação do arquivo com o carimbo de data/hora que ele registrou na leitura anterior. Se o arquivo foi alterado, o driver o analisa novamente.
  • Se as regras vieram originalmente de uma string de conexão, o driver reaplica o valor da string de conexão armazenado anteriormente.

Esse comportamento significa que edições em mssql-jdbc.properties são detectadas automaticamente em cerca de 30 segundos, sem reiniciar o aplicativo.

Importante

Como o conjunto de regras é um singleton em toda a JVM, ao abrir uma segunda conexão que define um valor diferente de retryExec ou retryConn, as regras da primeira conexão também são substituídas. Trate a configuração de CRL como uma configuração de nível de processo, não uma configuração por conexão, quando várias conexões na mesma JVM discordam.

Interação com queryTimeout e connectRetryCount

Novas tentativas de declaração e queryTimeout

Quando uma regra de instrução é acionada, o driver compara o próximo tempo de espera com o valor queryTimeout no nível da conexão:

  • Se queryTimeout >= 0etimeToWait > queryTimeout, o driver vai gerar R_InvalidRetryInterval em vez de repetir a tentativa. O driver não lança novamente o erro original. Ele gera o erro de configuração.
  • A queryTimeout propriedade de conexão usa -1como padrão, portanto, por padrão, a comparação é ignorada e qualquer espera é permitida.
  • Definir queryTimeout=0não desabilita essa verificação, porque 0 >= 0 é verdadeiro. Qualquer timeToWait > 0 gera R_InvalidRetryInterval.

Quando você definir queryTimeout como um valor positivo, mantenha o valor initialRetryTime + (retryCount - 1) * retryChange (aditivo) ou initialRetryTime * retryChange^(retryCount-1) (multiplicativo) abaixo desse valor.

Tentativas de conexão e connectRetryCount e loginTimeout

retryConn por si só, não permite novas tentativas de autenticação. As propriedades existentes continuam responsáveis:

  • connectRetryCount (padrão 1, intervalo de 0 a 255) é o número de tentativas de autenticação extras. Defina-o como 0 para desabilitar as tentativas de repetição de autenticação. retryConn não tem efeito quando connectRetryCount = 0, porque o driver lança uma exceção na primeira falha.
  • connectRetryInterval (padrão de 10 segundos, intervalo de 1 a 60) é a espera entre tentativas. A primeira repetição é executada imediatamente.
  • loginTimeout é o limite geral. O driver interrompe antecipadamente se o próximo intervalo fizer com que o tempo decorrido ultrapasse loginTimeout.

Para obter mais informações, consulte A resiliência de conexão (JDBC).

Exemplos

Lidar com impasses e limites de tempo de bloqueio durante gravações

jdbc:sqlserver://server;databaseName=db;retryExec={1205,1222:4,2*2:insert,update,delete,merge}

Até quatro novas tentativas para deadlock victim (1205) ou tempo limite de bloqueio (1222), com intervalos de espera de 2, 4, 8 e 16 segundos, mas apenas para instruções de escrita.

Executar novamente a criação de esquema em operações online

retryExec={2714:2,1+1};{3702:2,1+1}

Repete o erro 2714 (object already exists) e 3702 (cannot drop database currently in use) duas vezes cada, com esperas de 1 e 2 segundos.

Adicionar um erro personalizado à lista de erros transitórios

retryConn={+<customErrorNumber>}

Adiciona um número de erro personalizado que ainda não está na lista interna. Se você acrescentar um erro interno SQL do Azure transitório, como 40197, 40501, 40613, 49918, 49919 ou 49920, nada mudará porque o driver já o tenta novamente.

Configurar CRL por meio de um arquivo de propriedades

Coloque mssql-jdbc.properties ao lado do arquivo JAR do driver:

retryExec=1205:3,5+5:select,update
retryConn=+<customErrorNumber>

Não defina retryExec ou retryConn na conexão. O driver lê as regras do arquivo e as relê após cada modificação (verificado uma vez a cada 30 segundos).

Solucionar problemas de CRL

Habilite o log FINE (ou mais detalhado) no logger com.microsoft.sqlserver.jdbc.ConfigurableRetryLogic para ver as tentativas de leitura de arquivos e as decisões de processamento:

com.microsoft.sqlserver.jdbc.ConfigurableRetryLogic.level=FINE

Erros comuns de configuração:

Chave de mensagem de erro Cause
R_invalidParameterNumber Um token não numérico apareceu em que o driver esperava um número de erro ou um parâmetro de tempo ou retryTimings continha mais de uma vírgula.
R_InvalidRuleFormat A regra tinha mais de 3 seções separadas por ":".
R_InvalidRetryInterval O tempo de espera calculado para uma regra de declaração excede queryTimeout. Encurtar a espera ou aumentar queryTimeout.
R_PathInvalid ou R_URLInvalid O driver não conseguiu determinar um caminho para procurar por mssql-jdbc.properties.
R_errorReadingStream Erro de E/S durante a leitura de mssql-jdbc.properties.

Note

O texto de uma mensagem R_invalidParameterNumber diz O número do parâmetro {0} não é válido, que é a mesma string de recurso que o driver usa para erros de vinculação de parâmetros de instruções preparadas. Quando CRL lança, o valor inválido é o token da regra de repetição (por exemplo, um número de erro ou elemento de temporização que não seja numérico), e não um índice de parâmetro PreparedStatement.

Itens a verificar quando uma regra não é acionada:

  1. A exceção SQLServerError.getErrorNumber() corresponde, na verdade, ao número em sua regra. SQL Server pode encapsular algumas falhas em números diferentes dependendo do contexto (por exemplo, deadlock versus tempo limite de bloqueio).
  2. Para regras de instrução com um queryFilter, o primeiro token delimitado por espaço em branco do SQL que você executou (convertido para minúsculas) está na lista de filtros. Comentários e WITH CTEs alteram o primeiro token.
  3. retryCount novas tentativas são tentativas adicionais. A primeira execução não conta.
  4. Para as regras de conexão, connectRetryCount é maior do que 0 e loginTimeout permite pelo menos mais um connectRetryInterval.
  5. A regra tem a forma certa. As regras de declaração precisam de uma seção de temporizações. As regras de conexão não devem.