Entender as propriedades de tempo limite no driver JDBC

Baixar o JDBC Driver

As configurações de tempo limite no driver JDBC podem ser usadas para priorizar a capacidade de resposta do aplicativo. Por padrão, a maioria dos tempos limite do driver prioriza a espera de um resultado para garantir a consistência dos dados. Escolha tempos limite apropriados para as necessidades do aplicativo.

Para a conexão inicial, loginTimeout é usado:

  • loginTimeout é o número de segundos que o motorista espera para estabelecer uma conexão com o servidor. Se esse tempo passar, o driver retorna um erro e não abre a conexão. Um valor zero define o timeout para o tempo padrão do sistema, que é de 30 segundos no driver JDBC 11.2 e versões posteriores. No driver JDBC 10.2 e versões anteriores, o tempo padrão é de 15 segundos. Qualquer valor diferente de zero define o número de segundos que o motorista espera antes de encerrar uma conexão falhada. Se você sempre tem dificuldade para estabelecer uma conexão com o driver JDBC, talvez precise aumentar esse tempo para 90 ou até 120 segundos. loginTimeout também limita as tentativas de reconexão do driver, não apenas uma única tentativa. Isso importa quando você se conecta a um Banco de Dados SQL do Azure sem servidor com pausa automática. Para obter mais informações, confira Conectar-se a um banco de dados sem servidor pausado automaticamente.

Uma vez estabelecida a conexão, queryTimeout, cancelQueryTimeout e lockTimeout são usados durante as execuções de instrução. socketTimeout é usado para qualquer comunicação do driver com o servidor.

  • queryTimeout é o tempo, em segundos, que o driver aguardará, após o envio de um comando de execução ao servidor, por uma resposta dele com os dados. Se esse tempo for excedido, o comando será cancelado. Exceder esse tempo limite não encerra a conexão. O valor padrão é -1, que significa tempo limite infinito.
  • cancelQueryTimeout é o tempo, em segundos, que o driver espera que o servidor confirme o cancelamento de queryTimeout antes de encerrar/fechar a conexão à força. Isso significa que o driver espera o total de cancelQueryTimeout mais queryTimeout segundos antes de encerrar a conexão. Definir esse tempo limite para um valor diferente de zero garante que os aplicativos possam permanecer responsivos em caso de falha na rede ou na comunicação com o servidor quando uma consulta atinge o tempo limite. O valor padrão para esta propriedade é -1, que é um tempo de espera infinito.
  • lockTimeout é o tempo de espera até que um bloqueio seja liberado, nos casos em que há um bloqueio impedindo a execução da instrução. Exceder esse tempo limite não resulta em encerramento de conexão. O valor padrão para esta propriedade é -1, que é um tempo de espera infinito.
  • socketTimeout aplica-se a todas as comunicações de soquete com o servidor. Se o servidor interromper a comunicação com o driver, seja por não reconhecer ou não responder aos dados, o driver aguardará o valor de socketTimeout antes de encerrar a conexão. Definir esse tempo limite para um valor diferente de zero garante que os aplicativos possam permanecer responsivos em caso de falha na rede ou na comunicação com o servidor. O valor padrão é 0, que significa tempo limite infinito. Certifique-se de que socketTimeout seja maior do que queryTimeout para evitar exceções de tempo limite de soquete durante a janela queryTimeout. Similarmente, certifique-se de que socketTimeout seja maior do que cancelQueryTimeout para evitar exceções de tempo limite de soquete durante a janela cancelQueryTimeout.

Os valores de tempo limite adequados para o aplicativo dependem das prioridades dele. Definir valores de tempo limite mais baixos prioriza a capacidade de resposta do aplicativo, em vez de a consistência dos dados. Quando o tempo limite é atingido, os aplicativos precisam decidir o melhor curso de ação. Essa decisão é baseada na ação do banco de dados que está sendo executada. Por exemplo, para uma SELECT instrução, a decisão pode ser relatar um erro ao usuário, ou pode ser reconectar e tentar novamente. No caso de instruções INSERT ou UPDATE, essa decisão pode ser diferente.

Para um aplicativo responsivo, loginTimeout e queryTimeout devem ser definidos com valores relativamente baixos. Da mesma forma, cancelQueryTimeout também deve ser definido com um valor baixo a fim de garantir que o driver não espere muito tempo pela confirmação do servidor com relação ao cancelamento da consulta quando um queryTimeout for excedido. Por fim, socketTimeout deve ser definido para evitar que o driver espere muito tempo durante qualquer cenário em que a conectividade com o servidor seja interrompida (interrupção da rede, travamento do servidor etc.).

Resumo da propriedade

Propriedade Descrição Padrão Resultado da conexão
loginTimeout O número de segundos que o driver deve aguardar antes que o tempo limite de uma conexão com falha seja alcançado. 30 segundos [11.2+],
caso contrário, 15 segundos
Conexão encerrada
queryTimeout O número de segundos a aguardar antes de cancelar uma consulta. -1 [tempo limite infinito] Conexão aberta
cancelQueryTimeout O número de segundos para aguardar uma confirmação de cancelamento de QueryTimeout. -1 [tempo limite infinito] Conexão encerrada
lockTimeout O número de milissegundos a aguardar antes que o banco de dados retorne um erro de tempo limite de bloqueio. -1 [tempo limite infinito] Conexão aberta
socketTimeout O número de milissegundos de espera em uma leitura ou gravação de soquete. Zero [tempo limite infinito] Conexão encerrada