Descripción de las propiedades de tiempo de espera en el controlador JDBC

Descargar controlador JDBC

La configuración del tiempo de espera del controlador JDBC se puede usar para priorizar la capacidad de respuesta de la aplicación. De forma predeterminada, la mayoría de los tiempos de espera del controlador priorizan la espera de un resultado para garantizar la coherencia de los datos. Asegúrese de elegir los tiempos de espera adecuados para las necesidades de la aplicación.

Para la conexión inicial, se usa loginTimeout:

  • loginTimeout es el número de segundos que el controlador espera para establecer una conexión con el servidor. Si pasa este tiempo, el controlador devuelve un error y no abre la conexión. Un valor cero establece el tiempo de espera al tiempo de espera predeterminado del sistema, que es de 30 segundos en el controlador JDBC 11.2 y versiones posteriores. En el controlador JDBC 10.2 y versiones anteriores, el tiempo de espera por defecto es de 15 segundos. Cualquier valor distinto de cero establece el número de segundos que el controlador espera antes de dar por caducada una conexión fallida. Si tienes problemas constantes para establecer una conexión con el controlador JDBC, puede que necesites aumentar este tiempo de espera a 90 o incluso 120 segundos. loginTimeout también limita los reintentos de conexión del driver, no solo un único intento, lo cual es importante cuando te conectas a una base de datos de Azure SQL Database sin servidor que se pausa automáticamente. Para más información, consulte Conexión a una base de datos sin servidor en pausa automática.

Una vez establecida la conexión, queryTimeout, cancelQueryTimeout y lockTimeout se usan durante las ejecuciones de instrucciones. socketTimeout se usa para cualquier comunicación del controlador con el servidor.

  • queryTimeout es el tiempo, en segundos que esperará el controlador, después de enviar un comando execute al servidor, para recibir una respuesta del servidor con datos. Si se supera este tiempo, se cancela el comando. Superar este tiempo de espera no hace que se cierre la conexión. El valor predeterminado es -1, lo que significa que el tiempo de espera es infinito.
  • cancelQueryTimeout es el tiempo, en segundos, que el controlador espera a recibir una confirmación de la queryTimeout cancelación por parte del servidor, antes de terminar o cerrar la conexión de forma forzada. Es decir, el controlador espera la cantidad total de cancelQueryTimeout más queryTimeout segundos, antes de cerrarse la conexión. Establecer este tiempo de espera en un valor distinto de cero garantiza que las aplicaciones puedan seguir respondiendo si hay un error de red o de comunicación con el servidor, una vez superado el tiempo de espera de una consulta. El valor predeterminado de esta propiedad es -1, que es un tiempo de espera infinito.
  • lockTimeout es la cantidad de tiempo que hay que esperar para que se libere un bloqueo, en aquellos casos en los que hay un bloqueo en la ejecución de instrucciones. Superar este tiempo de espera no da como resultado una conexión cerrada. El valor predeterminado de esta propiedad es -1, que es un tiempo de espera infinito.
  • socketTimeout se aplica a todas las comunicaciones de socket con el servidor. Si el servidor detiene la comunicación con el controlador, ya sea no confirmando los datos o no respondiendo a estos, el controlador espera el valor de socketTimeout antes de cerrar la conexión. Establecer este tiempo de espera en un valor distinto de cero garantiza que las aplicaciones puedan seguir respondiendo si hay un error de red o de comunicación con el servidor. El valor predeterminado es 0, lo que significa que el tiempo de espera es infinito. Asegúrese de que socketTimeout es mayor que queryTimeout para evitar excepciones de tiempo de espera de socket durante la ventana queryTimeout. De forma similar, asegúrese de que socketTimeout es mayor que cancelQueryTimeout para evitar excepciones de tiempo de espera de socket durante la ventana cancelQueryTimeout.

Los valores de tiempo de espera razonables de la aplicación dependen de las prioridades de esta. Con el establecimiento de valores inferiores para los tiempos de espera se prioriza la capacidad de respuesta de la aplicación sobre la coherencia de los datos. Cuando se alcanzan los tiempos de espera, las aplicaciones deben decidir la mejor forma de actuar. Esa decisión se basa en la operación de la base de datos que se está realizando. Por ejemplo, para una SELECT sentencia, la decisión puede ser informar de un error al usuario, o puede ser reconectar y volver a intentarlo. Para las afirmaciones INSERT o UPDATE, esa decisión podría ser diferente.

En el caso de una aplicación con capacidad de respuesta, loginTimeout y queryTimeout deben establecerse en valores relativamente bajos. Del mismo modo, cancelQueryTimeout también debe establecerse en un valor bajo a fin de garantizar que el controlador no tenga que esperar demasiado tiempo para que el servidor confirme la cancelación de la consulta, al superarse un valor queryTimeout. Por último, socketTimeout debe establecerse para evitar que el controlador espere demasiado tiempo durante cualquier escenario en el que la conectividad al servidor se haya interrumpido (interrupción de la red, bloqueo del servidor, etc.).

Resumen de propiedades

Propiedad Descripción Valor predeterminado Resultado de conexión
loginTimeout Número de segundos que debería esperar el controlador antes de agotar el tiempo de espera de una conexión errónea. 30 segundos [11.2 y versiones posteriores],
en caso contrario, 15 segundos
Conexión cerrada
queryTimeout Número de segundos de espera antes de cancelar una consulta. -1 [tiempo de espera infinito] Conexión abierta
cancelQueryTimeout Número de segundos de espera para la confirmación de la cancelación de QueryTimeout. -1 [tiempo de espera infinito] Conexión cerrada
lockTimeout Número de milisegundos que hay que esperar antes de que la base de datos devuelva un error de tiempo de espera de bloqueo. -1 [tiempo de espera infinito] Conexión abierta
socketTimeout Número de milisegundos de espera en una operación de lectura o escritura en un socket. Cero [tiempo de espera infinito] Conexión cerrada