Cómo hacer timeout a un query de JDBC

Advertisements

En un momento donde JPA, Spring Data y otras especificaciones son el estándar para conectarse a las bases de datos, JDBC sigue presente y es útil en muchos casos de uso. Cuando se trabaja en este nivel bajo, se necesita realizar más código y pasos, de forma predeterminada, JDBC no implementa ningún timeout por defecto al realizar una consulta, por lo tanto, si sucede algo, la operación puede demorar más y atascarse si no se interrumpe.

Es una buena práctica agregar un timeout a la consulta de la base de datos y es muy fácil hacerlo. Afortunadamente, la clase Statement tiene un método setQueryTimeout(int segundos) para indicarlo. Cuando se ejecuta la consulta (executeUpdate, executeQuery or execute), si la operación lleva más tiempo que el tiempo de espera especificado, generará una excepción SQLTimeoutException e interrumpirá la operación.

Veamos el código

Veamos algunos ejemplos como referencia.

Advertisements
try {
	Statement stmt = connection.prepareStatement("SELECT * FROM MY_TABLE");
	stmt.setQueryTimeout(10);//Set a timeout of 10 seconds
	ResultSet result = stmt.executeQuery(); 
} catch (SQLTimeoutException timeoutException){
  //executeQuery exceeded 10 seconds, query is interrupted
  //handle the exception 
}

También al hacer operaciones DLM (como un Update).

try {
  PreparedStatement stmt = connection.prepareStatement("UPDATE MY_TABLE SET FIELD_1 = ? WHERE ID = ?");
  stmt.setString(1, "Some Value");
  stmt.setLong(2, 1234L);
  stmt.setQueryTimeout(5);//Timeout of 5 seconds
  stmt.executeUpdate();
} catch (SQLTimeoutException timeoutException){
  //executeQuery exceeded 5 seconds, query is interrupted
  //handle the exception 
}

Muy sencillo, con solo una línea stmt.setQueryTimeout(segundos); el código puede evitar atascarse y convertirse en una aplicación más resistente.

Referencias

Advertisements

Leave a Reply

Your email address will not be published. Required fields are marked *