Avec votre approche, la connexion ne sera jamais fermée si une exception a été levée avant le conn.close()
est appelé. Vous devez l'acquérir (ainsi que l'instruction et le jeu de résultats) dans un try
bloquez-le et fermez-le dans le finally
bloquer. Tout code dans finally
sera toujours être exécuté qu'une exception ait été levée ou non. Avec cela, vous pouvez assurer que les ressources coûteuses seront fermées.
Voici une réécriture :
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;
}
Cela dit, ce code est sensible à l'injection SQL
attaques
. Utiliser un PreparedStatement
au lieu de Statement
.
Voir aussi :
- Didacticiel Sun Exceptions :Le bloc "Enfin"
- Tutoriel Sun JDBC :introduction
- Tutoriel Sun JDBC :comment utiliser PreparedStatement
- Tutoriel DAO :comment utiliser correctement le code JDBC de base