Met jouw aanpak zal de verbinding nooit worden gesloten als er een uitzondering wordt gegenereerd voordat de conn.close()
wordt genoemd. Je moet het (en het statement en de resultatenset) verkrijgen in een try
blok en sluit het in de finally
blok. Elke code in finally
zal altijd worden uitgevoerd, ongeacht of er een uitzondering is gegenereerd of niet. Hiermee kunt u ervoor zorgen dat de dure bronnen zullen worden gesloten.
Hier is een herschrijving:
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;
}
Dat gezegd hebbende, deze code is gevoelig voor SQL-injectie
aanvallen
. Gebruik een PreparedStatement
in plaats van Statement
.
Zie ook :
- Sun Exceptions-tutorial:het blok Eindelijk
- Sun JDBC-zelfstudie:introductie
- Sun JDBC-zelfstudie:hoe PreparedStatement te gebruiken
- DAO-zelfstudie:hoe de basis-JDBC-code correct te gebruiken