Entender as propriedades de tempo limite no driver JDBC
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 tempo, em segundos, que o driver espera para estabelecer uma conexão com o servidor. Se esse valor for excedido, um erro será retornado e nenhuma conexão aberta será estabelecida. Um valor zero indica que o tempo limite é o tempo limite padrão do sistema, que é de 30 segundos na versão 11.2 e em versões superiores. Para a versão 10.2 e as versões anteriores, o tempo limite padrão é de 15 segundos. Qualquer valor diferente de zero é o número de segundos que o driver deve esperar antes de expirar uma conexão com falha. Se você tiver problemas constantemente para estabelecer uma conexão com o driver JDBC, tente aumentar esse tempo limite para 90 ou até 120 segundos.
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 por uma confirmação do cancelamento dequeryTimeout
do servidor, antes de encerrar/fechar a conexão à força. Isso significa que o driver espera o total decancelQueryTimeout
maisqueryTimeout
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 para liberar um bloqueio, nos casos em que há uma execução de instrução de bloqueio. 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 desocketTimeout
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 quesocketTimeout
seja maior do quequeryTimeout
para evitar exceções de tempo limite de soquete durante a janelaqueryTimeout
. Similarmente, certifique-se de quesocketTimeout
seja maior do quecancelQueryTimeout
para evitar exceções de tempo limite de soquete durante a janelacancelQueryTimeout
.
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 instrução SELECT
, a decisão pode ser relatar um erro ao usuário ou reconectar e tentar novamente. Para as 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 |