que he estado haciendo revisión de código (en su mayoría utilizando herramientas como FindBugs) de uno de nuestros proyectos favoritos y FindBugs marcada como errónea siguiente código (pseudocódigo):ResultSet no cerrado cuando se cierra la conexión?
Connection conn = dataSource.getConnection();
try{
PreparedStatement stmt = conn.prepareStatement();
//initialize the statement
stmt.execute();
ResultSet rs = stmt.getResultSet();
//get data
}finally{
conn.close();
}
El error fue que este código podría no liberar recursos . Me di cuenta de que el conjunto de resultados y la declaración no estaban cerradas, así que les cerraba en último:
finally{
try{
rs.close()
}catch(SqlException se){
//log it
}
try{
stmt.close();
}catch(SqlException se){
//log it
}
conn.close();
}
Pero me encontré con el patrón anterior en muchos proyectos (de un buen número de empresas), y nadie estaba ResultSets cierre o Declaraciones.
¿Tuvo problemas con ResultSets y las declaraciones no se cierran cuando la conexión está cerrada?
Encontré solo this y se refiere a que Oracle tiene problemas para cerrar los ResultSets al cerrar Connections (usamos Oracle db, de ahí mis correcciones). java.sql.api no dice nada en Connection.close() javadoc.
Le recomiendo usar Apache Commons-dbUtils (http://commons.apache.org/dbutils/) Es una biblioteca JDBC ligero que realmente limpia un montón de código estándar JDBC. –
Este es el tipo de errores que se producen cuando no cierran los objetos relevantes: "ORA-01000: el máximo de los cursores abiertos excedió" - http: // stackoverflow.com/questions/12192592/java-sqlception-ora-01000-maximum-open-cursors-excedido –
cursor de la base de datos - http://stackoverflow.com/questions/3861558/what-are-the-benefits-of-using -database-cursor Un cursor es una herramienta que le permite iterar los registros en un conjunto. Tiene conceptos de orden y registro actual. –