Dzięki Twojemu podejściu połączenie nigdy nie zostanie zamknięte, jeśli zostanie zgłoszony jakikolwiek wyjątek przed conn.close()
jest nazywany. Musisz go zdobyć (oraz instrukcję i zestaw wyników) w try
zablokuj i zamknij go w finally
blok. Dowolny kod w finally
będzie zawsze być wykonywane niezależnie od tego, czy został zgłoszony wyjątek, czy nie. Dzięki temu możesz zapewnić że drogie zasoby zostaną zamknięte.
Oto przepis:
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 powiedziawszy, ten kod jest wrażliwy na wstrzyknięcie SQL
ataki
. Użyj PreparedStatement
zamiast Statement
.
Zobacz też :
- Samouczek Wyjątki słońca:blok na koniec
- Samouczek Sun JDBC:wprowadzenie
- Samouczek Sun JDBC:jak korzystać z PreparedStatement
- Samouczek DAO:jak prawidłowo używać podstawowego kodu JDBC