Med ditt tillvägagångssätt kommer anslutningen aldrig att stängas om något undantag har kastats före conn.close()
kallas. Du måste skaffa den (och uttalandet och resultatuppsättningen) i ett try
blockera och stäng den i finally
blockera. Valfri kod i finally
kommer alltid verkställas oavsett om ett undantag har kastats eller inte. Med detta kan du försäkra att de dyra resurserna kommer att stängas.
Här är 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;
}
Som sagt, den här koden är känslig för SQL-injektion
attacker
. Använd en PreparedStatement
istället för Statement
.
Se även :
- Sun Exceptions tutorial:The Finally block
- Sun JDBC-handledning:introduktion
- Sun JDBC-handledning:hur man använder PreparedStatement
- DAO-handledning:hur man använder grundläggande JDBC-kod på rätt sätt