Dengan pendekatan Anda, koneksi tidak akan pernah ditutup jika ada pengecualian yang dilemparkan sebelum conn.close()
disebut. Anda perlu mendapatkannya (dan pernyataan dan hasil) dalam try
blokir dan tutup di finally
memblokir. Kode apa saja di finally
akan selalu dieksekusi terlepas dari pengecualian telah dilemparkan atau tidak. Dengan ini Anda dapat memastikan bahwa sumber daya yang mahal akan ditutup.
Berikut penulisan ulang:
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;
}
Karena itu, kode ini sensitif terhadap injeksi SQL
serangan
. Gunakan PreparedStatement
bukannya Statement
.
Lihat juga :
- Tutorial Pengecualian Matahari:Blok Terakhir
- Tutorial Sun JDBC:pengantar
- Tutorial Sun JDBC:cara menggunakan PreparedStatement
- Tutorial DAO:cara menggunakan kode JDBC dasar dengan benar