Med din tilgang vil forbindelsen aldrig blive lukket, hvis nogen undtagelse er blevet kastet før conn.close()
Hedder. Du skal erhverve det (og erklæringen og resultatsættet) i et try
blokere og lukke den i finally
blok. Enhver kode i finally
vil altid udføres uanset om en undtagelse er blevet kastet eller ej. Med dette kan du sikre at de dyre ressourcer bliver lukket.
Her er en omskrivning:
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;
}
Når det er sagt, er denne kode følsom over for SQL-injektion
angreb
. Brug en PreparedStatement
i stedet for Statement
.
Se også :
- Selvstudier til Sun Exceptions:The Finally-blokken
- Sun JDBC-selvstudie:introduktion
- Sun JDBC tutorial:hvordan man bruger PreparedStatement
- DAO-selvstudie:hvordan man bruger grundlæggende JDBC-kode korrekt