S vaším přístupem se spojení nikdy neuzavře, pokud je vyvolána nějaká výjimka před conn.close()
je nazýván. Musíte jej získat (a příkaz a sadu výsledků) v try
blok a zavřete jej v finally
blok. Jakýkoli kód v finally
bude vždy být proveden bez ohledu na to, zda byla nebo nebyla vyvolána výjimka. S tím můžete zajistit že drahé zdroje budou uzavřeny.
Zde je přepsání:
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;
}
To znamená, že tento kód je citlivý na vložení SQL
útoky
. Použijte PreparedStatement
místo Statement
.
Viz také :
- Výukový program Sun Exceptions:The Last block
- Výukový program Sun JDBC:úvod
- Výukový program Sun JDBC:jak používat PreparedStatement
- Výukový program DAO:jak správně používat základní kód JDBC