あなたのアプローチでは、前に例外がスローされた場合、接続が閉じられることはありません。 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 Exceptionsチュートリアル:Finallyブロック>
- Sun JDBCチュートリアル:はじめに
- Sun JDBCチュートリアル:PreparedStatementの使用方法
- DAOチュートリアル:基本的なJDBCコードを適切に使用する方法