Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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 ligação, com base nos números de erro do SQL Server que selecionar, com parâmetros de temporização definidos por si. O CRL foi introduzido no Microsoft JDBC Driver 12.10 para SQL Server.
O CRL é separado da resiliência da ligação inativa e das propriedadesconnectRetryCount / connectRetryInterval. A recuperação automática em inatividade restabelece de forma transparente ligações interrompidas e connectRetryCount repete a autenticação inicial a intervalos fixos para uma lista predefinida de erros transitórios. O CRL permite decidir que erros podem ser repetidos, quantas vezes e quanto tempo esperar entre tentativas. Podes usar os três mecanismos em conjunto.
O que o CRL retenta
O CRL lida com dois cenários distintos, cada um controlado pela sua própria propriedade de ligação:
| Scenario | Property | Quando ocorre a nova tentativa | Desencadeado por |
|---|---|---|---|
| Falha de execução da instrução | retryExec |
Durante a execução de uma instrução (por exemplo, executeQuery, executeUpdate, execute, ou execução em lote) |
Uma SQLServerException cujo número de erro corresponde a uma regra de instrução configurada |
| Falha inicial de ligação ou autenticação | retryConn |
No interior do ciclo de ligação e nova tentativa do controlador (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 predefinição, qualquer erro transitório já abrangido pela lista incorporada de novas tentativas |
Para instruções, o driver repete apenas o comando que falhou. O controlador não repõe o estado atual da transação, pelo que deves conceber as regras em função de erros que mantenham a sessão utilizável, como vítima de impasse (1205) ou tempo limite de bloqueio (1222).
Para ligações, o CRL complementa ou substitui a lista interna do controlador de erros transitórios de ligação. Consulte Regras de nova tentativa de ligação para a semântica do prefixo +.
Ativar CRL
O CRL tem duas camadas:
- A camada de repetição da ligação está ativada por predefinição: enquanto
connectRetryCount > 0(a predefinição é 1), o controlador volta a tentar a ligação com base na lista integrada de erros transitórios de ligação. - A camada de personalização (as tuas próprias regras
retryExeceretryConn) está desativada por defeito. Ambas as propriedades são cadeias vazias, a menos que as definas. Pode defini-los através do URL JDBC, de umPropertiesobjeto ou de umSQLServerDataSource. O driver remove as embalagens opcionais{...}nas três formas.
Os trechos de Java neste artigo omitem as importações e as declarações de classe por razões de brevidade.
Na URL JDBC
Cada regra (ou toda a lista de regras) deve ser envolta entre colchetes ({...}) porque a URL do 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 das regras
Uma única regra tem até três secções separadas por dois pontos:
<errorNumbers> : <retryTimings> : <queryFilter>
| Seção | Obrigatório? | Meaning |
|---|---|---|
errorNumbers |
Yes | Um número de erro do SQL Server, ou vários separados por vírgulas (por exemplo, 1205 ou 1205,1222). Para as regras de ligação, um + inicial opcional determina se os erros transitórios existentes são mantidos. |
retryTimings |
Obrigatório para as regras da declaração . Omita as regras de ligação. |
retryCount[,initialRetryTime[<op>retryChange]] onde <op> é + (aditivo) ou * (multiplicativo). |
queryFilter |
Opcional, apenas regras de declaração | Lista de palavras-chave SQL separada por vírgulas. O driver minúscula o valor em tempo de análise e minúscula o SQL previamente executado em tempo de execução. A regra é acionada quando a lista combinada de filtros contém o primeiro token da instrução SQL executada. Omita a terceira secção para desativar o filtro. |
Para usar várias regras na mesma propriedade, separe-as com ; e envolva cada regra com {...} ao colocá-las num URL JDBC.
Parâmetros de temporização
Para uma regra de declaração com temporizações retryCount, initialRetryTime <op> retryChange:
-
retryCount: O número de tentativas adicionais que o condutor faz após a primeira falha. Um valor de0desativa a nova tentativa. Valores negativos são inválidos. -
initialRetryTime: O número de segundos a esperar antes da primeira tentativa novamente. O valor predefinido é0. -
<op>: O operador, que pode ser+ou*. O valor predefinido é+. -
retryChange: O montante aplicado para calcular os tempos de espera subsequentes. O valor predefinido é2. Quando o operando é*eretryChangeé omitido da regra, o driver defineretryChange = initialRetryTime.
Importante
Se fornecer initialRetryTime sem um operando explícito (por exemplo, 3,5), o driver usa os valores padrão para o operando e retryChange (+ e 2). As esperas não são constantes. Crescem 2 em cada tentativa. Para obter uma espera constante, use a forma retryCount,N+0 explícita (por exemplo, 3,5+0).
O controlador calcula o tempo de espera para a tentativa n.º i (com base em 0) durante a análise:
| Operando | Aguardar a tentativa i |
|---|---|
+ (aditivo) |
initialRetryTime + (retryChange * i) |
* (multiplicativo) |
initialRetryTime * (retryChange ^ i) |
Exemplos de cadeias de temporização:
| String | retryCount | inicialRetryTime | operando | Tentar novamente a alteração | Sequência de espera (segundos) |
|---|---|---|---|---|---|
3 |
3 | 0 (padrão) |
+ (padrão) |
2 (por defeito) | 0, 2, 4 |
3,5 |
3 | 5 |
+ (padrão) |
2 (por defeito) | 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 é omitido) |
1, 1, 1, 1 |
Uma retryTimings secção pode conter, no máximo, uma vírgula. Mais de uma vírgula gera R_invalidParameterNumber.
Regras de nova tentativa de instruções (retryExec)
As regras da declaração repetem a execução falhada da declaração. Quando uma instrução lança um SQLServerException, o driver:
- Procura o número do erro que causou a falha no conjunto de regras da instrução analisada.
- Se existir uma regra e a contagem atual de tentativas for inferior a
retryCount, opcionalmente verifica o último SQL executado contra oqueryFilter. - Se tudo corresponder, o controlador espera
waitTimes[retryAttempt]segundos (sujeito aqueryTimeout, veja Interação com queryTimeout e connectRetryCount) e executa novamente a instrução. - Se nenhuma regra corresponder, o condutor relança a exceção.
Formato (declarações)
{errorNumber(s):retryCount[,initialRetryTime[<op>retryChange]][:queryFilter]}
As regras da instrução devem incluir uma secção de temporizações.
retryCount é obrigatório. Uma regra que contém apenas um número de erro é interpretada como uma regra de conexão , pelo que para instruções fornecem sempre pelo menos retryCount.
Exemplos (afirmações)
| Regra | Effect |
|---|---|
{1205:3} |
Repita a vítima de interbloqueio (1205) até 3 vezes, sem intervalo entre tentativas. |
{1205,1222:3,5+5} |
Tente novamente em caso de vítima de deadlock e de tempo limite de bloqueio até 3 vezes, aguardando 5, 10 e 15 segundos. |
{2714:2,1*2} |
Repita "o objeto já existe" até 2 vezes, aguardando 1 segundo e depois 2 segundos. |
{1205:4,2+2:select,update} |
Repita apenas 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) é uma forma abreviada. O controlador expande a regra para uma entrada por erro, partilhando todas a mesma temporização e o mesmo filtro da consulta.
Regras de nova tentativa de ligação (retryConn)
As regras de conexão funcionam com o ciclo existente de tentativas de ligação. Este ciclo só está ativo quando connectRetryCount > 0 (o padrão é 1). O loop já tenta novamente uma lista predefinida de erros de ligação transitórios, com intervalos de connectRetryInterval segundos, até connectRetryCount tentativas adicionais, e está limitado por loginTimeout.
Uma regra de ligação inclui apenas uma secção com o número de erro. Não tem tempos nem filtro de consultas:
{[+]errorNumber(s)}
- Sem
+, as regras configuradas substituem a lista de erros transitórios incorporada. Só os erros que mencionas são tentados novamente. - Com
+(por exemplo,{+4060}), as regras configuradas são adicionadas à lista incorporada. Tanto as suas tentativas falhadas como as predefinições do controlador são novamente tentadas.
O modo de substituir ou acrescentar é global para todo o valor retryConn. Se alguma regra nesse valor omitir +, o controlador muda para o modo de substituição para todas as regras nesse valor. Por exemplo, retryConn={+4060};{40143} não acrescenta 4060 e 40143 à lista incorporada. A 40143 regra omite +, por isso a lista incorporada é eliminada e apenas 4060 e 40143 são retentados. Para acrescentar ambos, escreva retryConn={+4060};{+40143} (ou retryConn={+4060,40143}).
O loop de ligação continua a usar connectRetryInterval e connectRetryCount para ritmo e saltos de ritmo. A regra CRL expande ou substitui o conjunto de erros passíveis de nova tentativa.
Exemplos (ligações)
| Regra | Effect |
|---|---|
{+<customErrorNumber>} |
Adicione um número de erro personalizado à lista de erros transitórios incorporada. |
{+<customError1>,<customError2>} |
Adicione múltiplos números de erro personalizados à lista de erros transitórios incorporada. |
{4060} |
Tente novamente apenas o erro 4060. Os erros transitórios incorporados já não são retentados pela CRL. |
Note
retryConn não muda loginTimeout a semântica. O ciclo existente de repetição de tentativa de ligação continua a limitar o tempo total decorrido e desiste antecipadamente se o próximo connectRetryInterval fizer com que o tempo decorrido ultrapasse loginTimeout.
Lista de erros de ligação transitória incorporada
O loop connect-retry já tenta novamente os seguintes erros sem qualquer configuração CRL, desde que connectRetryCount > 0. Listar qualquer um destes erros numa regra retryConn com + não tem efeito (já estão abrangidos). Utilize a regra retryConn quando precisar de adicionar um erro que não consta desta lista, ou quando precisar de remover completamente a lista utilizando a forma no-+ replace.
Note
Não precisa de adicionar erros comuns de ligação transitória ao SQL do Azure, como 40197, 40501, 40613, 49918, 49919 ou 49920. A lista incorporada já os tenta novamente.
| Erro | Message | Troubleshooting |
|---|---|---|
| 64 | Uma conexão foi estabelecida com êxito com o servidor, mas ocorreu um erro durante o processo de login. (fornecedor: TCP Provider, erro: 0 - O nome da rede especificado já não está disponível.) | A ligação TCP caiu a meio do aperto de mão. Não é uma falha de credenciais. Se persistir, verifique se há instabilidade na rede do cliente, erros de descarregamento da NIC ou um dispositivo intermédio que deixa cair ligações semi-estabelecidas. |
| 233 | O cliente não conseguiu estabelecer uma ligação devido a um erro durante o processo de inicialização da ligação antes do login. | Falha de transporte pré-login ou TLS. O servidor normalmente devolve isto quando não consegue aceitar a ligação (esgotamento de recursos, ligações máximas alcançadas ou um cliente não suportado). Não é uma falha de credenciais. Verificar o estado do servidor, depois verificar loginTimeout, as definições de TLS e a compatibilidade entre as versões TLS do cliente e do servidor. |
| 4060 | Não é possível abrir a base de dados database_name solicitado pelo login. A autenticação falhou. | O login autenticou-se, mas não conseguiu abrir a base de dados solicitada. As causas transitórias incluem a base de dados estar em transição (failover, restauro, aumento de capacidade) ou em pausa automática. Causas persistentes (a base de dados não existe, o login não tem acesso) não serão corrigidas por uma nova tentativa; Verifique o nome da base de dados, o mapeamento de login e o estado da base de dados. |
| 4221 | Iniciar sessão no read-secondary falhou devido à longa espera em HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING. |
O secundário legível não conseguiu aceitar o login porque as versões da linha continuam em falta nas transações em voo quando a réplica foi reciclada. Atenue este problema evitando transações de escrita longas no primário; a repetição geralmente é bem-sucedida assim que o primário confirma ou anula as transações abertas. |
| 10053 | Ocorreu um erro ao nível do transporte ao enviar o pedido para o servidor. (fornecedor: TCP Provider, erro: 0 - Uma ligação estabelecida foi abortada pelo software na sua máquina anfitriã.) | O lado local abortou a ligação (Windows Sockets WSAECONNABORTED). Muitas vezes uma falha do keepalive ou a pilha da rede local a destruir uma ligação inativa ou meio aberta. Verifique o estado da rede no lado do cliente, os temporizadores de keepalive do sistema operativo e qualquer firewall local ou cliente de VPN. |
| 10054 | Ocorreu um erro ao nível do transporte ao enviar o pedido para o servidor. (fornecedor: TCP Provider, erro: 0 - Uma ligação existente foi encerrada à força pelo host remoto.) | O lado remoto enviou um reset TCP (Windows Sockets WSAECONNRESET). Causas comuns: o processo peer crashava, um firewall injetava um reset, ou o gateway SQL do Azure fechava uma ligação inativa. Para casos de reposição da ligação por inatividade, ative o keepalive de TCP no cliente ou reduza o tempo limite de inatividade do conjunto de ligações. |
| 10928 | ID de Recurso: N. O limite do tipo limite para a base de dados é N e já foi atingido. Consulte sys.dm_exec_sessions para obter instruções de utilização. |
Foi atingido um limite de governação de recursos na base de dados (sessões, trabalhadores ou pedidos). Identifique o tipo de limite a partir da mensagem, depois reduza a concorrência, escale a base de dados ou encurta as operações de longa duração que detêm o recurso. |
| 10929 | ID de Recurso: N. A garantia mínima do tipo limite é N, o limite máximo é N e o uso atual da base de dados é N. No entanto, o servidor está atualmente demasiado ocupado para suportar pedidos superiores a N para esta base de dados. | A base de dados ultrapassa a sua garantia mínima e o servidor subjacente está a limitar. Retry normalmente tem sucesso quando a carga do vizinho diminui. Ocorrências prolongadas indicam que precisa de um nível de serviço mais elevado ou de um ambiente menos ruidoso. |
| 40020 40143 40166 40540 |
Reportado na posição Error code %d do erro 40197 durante a comutação pós-falha. |
Subcódigos incorporados numa mensagem de failover 40197 que alguns caminhos apresentam como o número de erro de nível superior. O controlador lista cada um individualmente para repetir a tentativa em qualquer uma das formas. Trata-os da mesma forma que 40197. |
| 40197 | O serviço encontrou um erro ao processar o seu pedido. Tente novamente. Código de erro N. | Uma atualização de software, falha de hardware ou outro evento de failover no SQL do Azure. Ao restabelecer a ligação, será encaminhado para uma réplica em bom estado. O código de erro incorporado identifica o tipo de failover. Ocorrências persistentes devem ser reportadas com o ID de rastreamento de sessão. |
| 40501 | o serviço está ocupado neste momento. Tente o pedido novamente após 10 segundos. ID do incidente: guid. Código: N. | Limitação do motor do SQL do Azure. O intervalo mínimo recomendado é de 10 segundos. A limitação sustentada indica que excedeu o limite permitido de DTU/vCore; aumente a capacidade ou reduza a simultaneidade. |
| 40613 | A base de dados database_name no servidor server_name não está atualmente disponível. Volte a tentar a ligação mais tarde. Se o problema persistir, contacte o apoio ao cliente e forneça-lhes o ID de rastreamento de sessão do guid. | A base de dados está indisponível, geralmente a meio do failover ou brevemente durante uma operação de escala. Tente novamente com intervalo progressivo; se o problema persistir durante mais do que alguns minutos, registe o ID de rastreio da sessão e abra um pedido de suporte. |
| 42108 | Não é possível se conectar ao pool SQL, pois ele está pausado. Reative o pool de SQL e tente novamente. | O pool dedicado de SQL (Synapse) está em estado de pausa. Tentar novamente só ajuda se algo reativar o pool em paralelo. Retome explicitamente o conjunto ou agende a carga de trabalho após a retoma. |
| 42109 | O pool SQL está aquecendo. Tente novamente. | O pool dedicado de SQL está a recomeçar. Tente novamente com intervalos progressivos até ficar online; a inicialização normalmente demora alguns minutos. |
| 49918 | Não é possível processar o pedido. Não há recursos suficientes para processar o pedido. | O plano de controlo não conseguiu alocar recursos para o pedido neste momento. Tente novamente após um intervalo de espera. Ocorrências persistentes indicam pressão regional de capacidade. |
| 49919 | Não é possível processar a solicitação de criação ou atualização. Demasiadas operações de criação ou atualização em curso para a subscrição N. | Limite de concorrência a nível da subscrição para operações de gestão. Reduza as chamadas paralelas de criação/atualização ou escalone-as. |
| 49920 | Não é possível processar o pedido. Demasiadas operações em curso para a subscrição N. | Limite de concorrência ao nível de subscrição para operações em voo. Reduzir o paralelismo ou esperar que as operações em voo se esgotem. |
A lista canónica do controlador é a TransientError enumeração que se encontra em SQLServerError.java. O texto da mensagem de erro provém de erros de ligação transitória do SQL do Azure. Erros ao nível da instrução (como deadlock victim 1205 ou lock-request timeout 1222) não estão nesta lista, porque o loop connect-retry só dispara durante a ligação inicial. Para tentar novamente esses erros, use uma retryExec regra.
Carregar regras de um ficheiro de propriedades
Se não definir retryExec ou retryConn na ligação, o CRL procura um ficheiro com o nome mssql-jdbc.properties junto do JAR do controlador no classpath. O ficheiro utiliza análise sintáctica básica key=value . Falas que começam com retryExec= ou retryConn= são captadas. Os valores utilizam a mesma sintaxe descrita neste artigo, separando ; múltiplas regras.
Use nomes de chaves exatos (retryExec e retryConn), sem espaço em branco inicial. O ficheiro não é analisado como um ficheiro completo de propriedades em Java. O condutor faz uma verificação literal startsWith em cada linha, por isso:
- As linhas que começam com
#ou qualquer outro prefixo diferente deretryExec/retryConnsão ignoradas. - Linhas cuja chave começa apenas com
retryExecouretryConn(por exemplo,retryExec2=...) são tratadas como propriedade de correspondência e podem produzir erros de análise sintática. Não introduza variantes personalizadas.
Exemplo mssql-jdbc.properties:
retryExec=1205:3,5+5;1222:2,2
retryConn=+4060,40143
Se o ficheiro estiver em falta, o CRL regista uma mensagem FINE no registador com.microsoft.sqlserver.jdbc.ConfigurableRetryLogic e continua sem regras. O caminho do ficheiro usado para a pesquisa está incluído nessa mensagem de registo.
Os valores das cadeias de ligação têm prioridade. Se retryExec ou retryConn não estiverem vazios na conexão, o controlador não consulta o ficheiro para essa propriedade.
Comportamento de atualização de regras
O CRL mantém um único conjunto de regras para toda a JVM. Após a construção, o condutor atualiza as regras de forma preguiçosa:
- O controlador avalia as oportunidades para atualização durante a execução da instrução e as novas tentativas de ligação.
- A atualização só acontece depois de 30 segundos desde a leitura anterior.
- Se as regras vieram originalmente de
mssql-jdbc.properties, o driver compara a marca temporal da última modificação do ficheiro com a marca temporal que registou na leitura anterior. Se o ficheiro mudou, o condutor corrige-o. - Se as regras vieram originalmente de uma cadeia de ligação, o driver reaplica o valor de connection-string previamente armazenado.
Este comportamento significa que as edições em mssql-jdbc.properties são detetadas automaticamente ao fim de cerca de 30 segundos, sem ser necessário reiniciar a aplicação.
Importante
Como o conjunto de regras é um singleton ao nível da JVM, abrir uma segunda ligação que defina um valor diferente de retryExec ou retryConn também substitui as regras da primeira ligação. Considere a configuração da CRL como uma definição ao nível do processo, e não uma definição por ligação, quando várias ligações na mesma JVM entram em conflito.
Interação com QueryTimeout e connectRetryCount
Repetições de instruções e queryTimeout
Quando uma regra de instrução é acionada, o controlador compara o próximo tempo de espera com o valor de queryTimeout ao nível da ligação:
- Se
queryTimeout >= 0etimeToWait > queryTimeout, o controlador geraR_InvalidRetryIntervalem vez de tentar novamente. O driver não relança o erro original. Gera o erro de configuração. - A propriedade de ligação
queryTimeouttem como valor predefinido-1, pelo que, por predefinição, a comparação é ignorada e qualquer período de espera é permitido. - A definição
queryTimeout=0não desativa esta verificação, porque0 >= 0é verdadeira. QualquertimeToWait > 0aumentaR_InvalidRetryInterval.
Quando definir queryTimeout para um valor positivo, mantenha o valor initialRetryTime + (retryCount - 1) * retryChange (aditivo) ou initialRetryTime * retryChange^(retryCount-1) (multiplicativo) abaixo desse valor.
Repetições de tentativa de conexão e connectRetryCount e loginTimeout
retryConn não ativa, por si só, tentativas de autenticação. As propriedades existentes mantêm-se sob controlo:
-
connectRetryCount(padrão 1, intervalo 0-255) é o número de tentativas adicionais de autenticação. Defina-o como0para desativar as tentativas de autenticação.retryConnnão tem efeito quandoconnectRetryCount = 0, porque o driver gera um erro à primeira falha. -
connectRetryInterval(padrão 10 segundos, alcance 1-60) é a espera entre tentativas. A primeira nova tentativa é executada imediatamente. -
loginTimeouté o limite global. O controlador desiste antecipadamente se o intervalo seguinte fizer com que o tempo decorrido ultrapasseloginTimeout.
Para mais informações, consulte Resiliência de Ligação (JDBC).
Exemplos
Lidar com impasses e expiração do tempo de bloqueio durante as operações de escrita
jdbc:sqlserver://server;databaseName=db;retryExec={1205,1222:4,2*2:insert,update,delete,merge}
Até quatro tentativas para vítima de deadlock (1205) ou tempo limite de bloqueio (1222), com backoff de 2, 4, 8 e 16 segundos, mas apenas para instruções de escrita.
Executar novamente a criação do esquema durante operações em linha
retryExec={2714:2,1+1};{3702:2,1+1}
Tenta novamente o erro 2714 (object already exists) e 3702 (cannot drop database currently in use) duas vezes cada, com espera 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 incorporada. Se adicionares um erro transitório SQL do Azure incorporado, como 40197, 40501, 40613, 49918, 49919 ou 49920, nada muda porque o driver já tenta novamente.
Configurar CRL através de um ficheiro de propriedades
Coloque mssql-jdbc.properties junto ao ficheiro JAR do controlador:
retryExec=1205:3,5+5:select,update
retryConn=+<customErrorNumber>
Não definas retryExec nem retryConn na ligação. O controlador lê as regras do ficheiro e volta a lê-lo após cada modificação (verificada a cada 30 segundos).
Resolver problemas de CRL
Ative o registo FINE (ou mais detalhado) no registador com.microsoft.sqlserver.jdbc.ConfigurableRetryLogic para ver as tentativas de leitura de ficheiros e as decisões de análise:
com.microsoft.sqlserver.jdbc.ConfigurableRetryLogic.level=FINE
Erros comuns de configuração:
| Chave de mensagem de erro | Motivo |
|---|---|
R_invalidParameterNumber |
Aparecia um token não numérico onde o condutor esperava um número de erro ou um parâmetro de temporização, ou retryTimings continha mais do que uma vírgula. |
R_InvalidRuleFormat |
A regra continha mais de 3 secções separadas por dois-pontos. |
R_InvalidRetryInterval |
O tempo de espera calculado de uma regra de declaração excede queryTimeout. Reduz a espera ou aumenta queryTimeout. |
R_PathInvalid ou R_URLInvalid |
O controlador não conseguiu resolver um caminho para procurar mssql-jdbc.properties. |
R_errorReadingStream |
Erro de I/O durante a leitura mssql-jdbc.properties. |
Note
O texto de uma mensagem R_invalidParameterNumber é O número do parâmetro {0} não é válido, que é a mesma cadeia de caracteres de recurso que o controlador usa para erros de associação de parâmetros em instruções preparadas. Quando o CRL gera isso, o valor inválido é o token da sua regra de repetição (por exemplo, um número de erro ou um elemento de temporização que não é numérico), e não um índice de parâmetro PreparedStatement.
Coisas a verificar quando uma regra não funciona:
- A exceção
SQLServerError.getErrorNumber()corresponde mesmo ao número da tua regra. O SQL Server pode enrolar algumas falhas em números diferentes dependendo do contexto (por exemplo, deadlock vs. timeout de bloqueio). - Para regras de instruções com ,
queryFiltero primeiro token delimitado por espaço em branco do SQL que executou (em minúscula) está na lista de filtros. Comentários eWITHCTEs modificam o primeiro token. -
retryCountRetentativas são tentativas adicionais . A primeira execução não conta. - Nas regras de ligação,
connectRetryCounté superior a 0 eloginTimeoutdeixa espaço para, pelo menos, mais umconnectRetryInterval. - A regra tem a forma certa. As regras de extrato devem incluir uma secção de temporizações. As regras de ligação não devem ser.