Mit Ihrem Ansatz wird die Verbindung niemals geschlossen, wenn vorher eine Ausnahme ausgelöst wird das conn.close()
wird genannt. Sie müssen es (und die Anweisung und Ergebnismenge) in einem try
erwerben blocken und im finally
schließen Block. Jeder Code in finally
wird immer unabhängig davon ausgeführt werden, ob eine Ausnahme ausgelöst wurde oder nicht. Damit können Sie sicherstellen dass die teuren Ressourcen geschlossen werden.
Hier ist eine Umschreibung:
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;
}
Allerdings ist dieser Code empfindlich gegenüber SQL-Injektion
Angriffe
. Verwenden Sie ein PreparedStatement
statt Statement
.
Siehe auch :
- Tutorial zu Sun-Ausnahmen:Der Endlich-Block
- Sun JDBC-Tutorial:Einführung
- Sun JDBC-Tutorial:Verwendung von PreparedStatement
- DAO-Tutorial:Wie man grundlegenden JDBC-Code richtig verwendet