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.
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.