Resiliência de conexão (JDBC)

Baixar o JDBC Driver

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.