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.
