Com sua abordagem, a conexão nunca será fechada se alguma exceção for lançada antes o
conn.close()
é chamado. Você precisa adquiri-lo (e a instrução e o conjunto de resultados) em um try
bloqueie e feche-o no finally
quadra. Qualquer código em finally
será sempre ser executado independentemente de uma exceção ter sido lançada ou não. Com isso você pode garantir que os recursos caros serão fechados. Aqui está uma reescrita:
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;
}
Dito isso, este código é sensível a injeção de SQL ataques . Use um
PreparedStatement
em vez de Statement
. Veja também :
- Tutorial de exceções do sol:o bloco Finalmente
- Tutorial Sun JDBC:introdução
- Tutorial Sun JDBC:como usar PreparedStatement
- Tutorial DAO:como usar o código JDBC básico corretamente