Debe cerrar cada uno que abra. Cuando crea una declaración preparada o un conjunto de resultados, la base de datos asigna recursos para ellos, y cerrarlos le dice a la base de datos que libere esos recursos (es probable que la base de datos reasigne estos recursos después de un período de tiempo de espera, pero al llamar cerca la base de datos sabe que puede seguir y limpiar). Su segundo ejemplo es mejor, excepto que cerraría el conjunto de resultados antes de la declaración preparada.
Así, con bloques try incluido que se vería así:
while (...){
PreparedStatement p = connection.prepareStatement(...);
try {
ResultSet r = p.executeQuery();
try {
while (r.next()) {
....
}
} finally {
try {
r.close();
} catch (SQLException e) {
// log this or something -- prevent these from masking original exception
}
}
}
finally {
try {
p.close();
} catch (SQLException e) {
// log this or something -- prevent these from masking original exception
}
}
}
la captura de las excepciones a partir del cierre es feo, pero si usted tiene una excepción lanzada durante la ejecución de la declaración preparada, o durante el recorrido de los resultados establecer, desea asegurarse de que lo ve, y no una excepción lanzada al cerrar la declaración preparada o conjunto de resultados (que se debe a un error de red que no puede hacer nada de todos modos).
También tenga en cuenta que el uso de try-with-resources funcionará, excepto que si tiene un caso en que la operación de la base de datos tiene éxito pero llama a cerrar resultados en una excepción, se lanzará la excepción.
Recomiendo a las personas que utilicen la biblioteca spring-jdbc (que se encarga de cerrar todo por ti) en lugar de generar iffy o verbose jdbc a mano.
Los cierra en un bloque finally, por lo que se asegura que esté cerrado incluso si hay alguna excepción de tiempo de ejecución – chedine