Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A resiliência de conexão permite que o driver JDBC restaure de forma transparente uma conexão ociosa interrompida e repita a conexão inicial se ela falhar. Este artigo aborda as duas propriedades de cadeia de conexão que controlam esse comportamento (connectRetryCount e connectRetryInterval) e as configurações keepalive que o driver usa para detectar uma conexão ociosa descartada. A resiliência de conexão está disponível a partir do Microsoft JDBC Driver 10.2.0 para SQL Server. Reconectar uma conexão ociosa interrompida requer SQL Server 2014 ou posterior ou Banco de Dados SQL do Azure.
Tip
A resiliência de conexão apenas tenta novamente a conexão inicial e restaura silenciosamente conexões ociosas interrompidas. Para tentar novamente automaticamente instruções que falharam (por exemplo, vítima de deadlock 1205 ou tempo limite de bloqueio 1222), ou para estender a lista de tentativas de nova conexão com números de erro personalizados (por exemplo, erros transitórios do SQL do Azure, como 40197 ou 40613), use a lógica de repetição configurável. CRL é baseada em regras; você escolhe os erros e o backoff, e ela funciona em conjunto com os recursos deste artigo.
Como o driver JDBC faz novas tentativas
O driver JDBC fornece três mecanismos de repetição independentes. Eles trabalham juntos, para que você possa usar todos eles de uma só vez:
| Mecanismo | O que faz | Onde saber mais |
|---|---|---|
| Resiliência da conexão inativa | Restaura de forma transparente uma conexão ociosa interrompida (por exemplo, uma conexão em pool fechada pelo servidor ou um balanceador de carga). | Detectar conexões ociosas interrompidas (este artigo) |
| Tentativa de conexão inicial | Repete a tentativa de uma conexão inicial com falha em intervalos fixos para uma lista predefinida de erros transitórios. | Repetir conexões iniciais (este artigo) |
| CRL (lógica de repetição configurável) | Nova tentativa baseada em regras para instruções que falharam e para números de erro personalizados. Introduzido no Microsoft JDBC Driver 12.10. | Lógica de repetição configurável |
Repetir conexões iniciais
O driver JDBC inclui duas propriedades de conexão que controlam com que frequência e quanto tempo o driver aguarda antes de tentar novamente a conexão inicial. Adicione essas propriedades ao cadeia de conexão ou defina-as por meio de propriedades da fonte de dados.
| Palavra-chave | Valores | Padrão | Descrição |
|---|---|---|---|
connectRetryCount |
Um inteiro entre 0 e 255 (inclusive) | 1 | O número máximo de tentativas de estabelecer ou restabelecer uma conexão antes de desistir. Por padrão, o driver faz uma única nova tentativa. Um valor de 0 desabilita nova tentativa. |
connectRetryInterval |
Um inteiro entre 1 e 60 (inclusive) | 10 | O tempo em segundos entre cada tentativa de conexão. O driver tenta se reconectar imediatamente quando detecta uma conexão ociosa interrompida e então aguarda connectRetryInterval segundos antes de tentar novamente. Essa propriedade é ignorada quando connectRetryCount é 0. |
Se connectRetryCount * connectRetryInterval for maior que loginTimeout, o driver interrompe as tentativas de conexão quando loginTimeout é atingido. Caso contrário, continuará até que connectRetryCount se esgote.
Essas propriedades repitam apenas a lista interna de erros transitórios de conexão. Para obter a lista completa de erros abordados (4060, 40197, 40501, 40613, 49918-49920 e outros), consulte a lista de erros de conexão transitória interna. Para adicionar números de erro personalizados a esse conjunto ou substituí-lo inteiramente, use retryConn na lógica de repetição configurável. Para repetir instruções com falha, use retryExec no mesmo artigo.
Definir as propriedades
Definir connectRetryCount e connectRetryInterval na URL JDBC, em um Properties objeto ou em um SQLServerDataSource.
Na URL JDBC:
jdbc:sqlserver://server;databaseName=db;connectRetryCount=3;connectRetryInterval=10
Com um objeto Properties. Neste artigo, os trechos de código Java omitem importações e declarações de classe para fins de brevidade.
Properties props = new Properties();
props.setProperty("user", "...");
props.setProperty("password", "...");
props.setProperty("connectRetryCount", "3");
props.setProperty("connectRetryInterval", "10");
Connection c = DriverManager.getConnection("jdbc:sqlserver://server;databaseName=db", props);
Com SQLServerDataSource:
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("server");
ds.setDatabaseName("db");
ds.setUser("...");
ds.setPassword("...");
ds.setConnectRetryCount(3);
ds.setConnectRetryInterval(10);
Detectar conexões inativas interrompidas
Uma conexão ociosa típica é aquela que fica em um pool de conexões. O driver considera uma conexão ociosa após cerca de 30 segundos sem atividade. O servidor ou um dispositivo de rede entre o cliente e o servidor pode fechar conexões ociosas, portanto, o driver precisa de uma maneira de observar que o soquete está morto antes que a próxima consulta seja executada.
Para detectar conexões ociosas interrompidas, o driver se baseia em pacotes de keepalive TCP no nível do soquete. No Linux e Java 11 ou posterior, o driver habilita automaticamente pacotes keepalive em um intervalo de 30 segundos (KeepAliveTime), com um atraso de 1 segundo entre repetições quando ocorre uma falha (KeepAliveInterval).
Importante
No Windows e no Java 11 ou anterior, você deve configurar os keepalives manualmente no sistema operacional para aproveitar a recuperação de conexão ociosa interrompida. Para obter informações sobre como configurar keep alives, confira Conexão com o banco de dados SQL do Azure.
Limitações
O driver não pode restaurar uma conexão ociosa interrompida quando qualquer uma das condições a seguir for verdadeira:
- Há um conjunto de resultados aberto que não foi totalmente processado nem armazenado em buffer.
- A conexão alternou os bancos de dados em SQL do Azure.
- Há uma transação aberta.