С вашия подход връзката никога няма да бъде затворена, ако е хвърлено изключение преди conn.close()
е наречен. Трябва да го придобиете (и оператора и набора от резултати) в try
блокирайте и го затворете в finally
блок. Всеки код в finally
щевинаги да се изпълни независимо дали е хвърлено изключение или не. С това можете да сигурите че скъпите ресурси ще бъдат затворени.
Ето пренаписване:
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;
}
Въпреки това този код е чувствителен към SQL инжектиране
атаки
. Използвайте PreparedStatement
вместо Statement
.
Вижте също :
- Урок за изключения на Sun:Блокът Finally
- Урок за Sun JDBC:въведение
- Урок за Sun JDBC:как да използвате PreparedStatement
- DAO урок:как да използвате правилно основния JDBC код