Con il tuo approccio, la connessione non verrà mai chiusa se viene generata un'eccezione prima il conn.close()
è chiamato. Devi acquisirlo (e la dichiarazione e il set di risultati) in un try
bloccalo e chiudilo nel finally
bloccare. Qualsiasi codice in finally
sarà sempre essere eseguito indipendentemente dal fatto che un'eccezione sia stata generata o meno. Con questo puoi garantire che le costose risorse verranno chiuse.
Ecco una riscrittura:
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;
}
Detto questo, questo codice è sensibile a SQL injection
attacchi
. Usa un PreparedStatement
invece di Statement
.
Vedi anche :
- Tutorial Sun Exceptions:il blocco Infine
- Tutorial Sun JDBC:introduzione
- Tutorial Sun JDBC:come utilizzare PreparedStatement
- Tutorial DAO:come utilizzare correttamente il codice JDBC di base