Con su enfoque, la conexión nunca se cerrará si se lanza alguna excepción antes el conn.close()
se llama. Debe adquirirlo (y la declaración y el conjunto de resultados) en un try
bloquee y ciérrelo en el finally
bloquear. Cualquier código en finally
será siempre ejecutarse independientemente de que se haya lanzado una excepción o no. Con esto puedes asegurarte que los costosos recursos serán cerrados.
Aquí hay una reescritura:
public int getSiteIdFromName(String name, String company) throws DataAccessException, java.sql.SQLException {
Connection conn = null;
Statement smt = null;
ResultSet rs = null;
int id = 0;
try {
conn = this.getSession().connection();
smt = conn.createStatement();
String query = "SELECT id FROM site WHERE name='" + name + "' and company_id='" + company + "'";
rs = smt.executeQuery(query);
rs.next();
id = rs.getInt("id");
} finally {
if (rs != null) try { rs.close(); } catch (SQLException logOrIgnore) {}
if (smt != null) try { smt.close(); } catch (SQLException logOrIgnore) {}
if (conn != null) try { conn.close(); } catch (SQLException logOrIgnore) {}
}
return id;
}
Dicho esto, este código es sensible a la inyección SQL
ataques
. Usar una PreparedStatement
en lugar de Statement
.
Ver también :
- Tutorial de excepciones de Sun:el bloque Finalmente
- Tutorial de Sun JDBC:introducción
- Tutorial de Sun JDBC:cómo usar PreparedStatement
- Tutorial de DAO:cómo utilizar correctamente el código JDBC básico