下面的代码无法编译,因为PreparedStatement.close()和ResultSet.close()都抛出了java.sql.SQLException。那么我要在finally子句中添加一个try / catch块吗?或者将close语句移动到try子句中?或者只是不打扰打电话?
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.createStatement(myQueryString);
rs = ps.executeQuery();
// process the results...
} catch (java.sql.SQLException e) {
log.error("an error!", e);
throw new MyAppException("I'm sorry. Your query did not work.");
} finally {
ps.close();
rs.close();
}
答案 0 :(得分:2)
利用Java 7中引入的新功能try-with-resources Statement
例如......
try (PreparedStatement ps = conn.createStatement(myQueryString)) {
// bind parameters
try (ResultSet rs = rs = ps.executeQuery()) {}
// process the results...
}
} catch (java.sql.SQLException e) {
log.error("an error!", e);
throw new MyAppException("I'm sorry. Your query did not work.");
}
答案 1 :(得分:1)
使用try-with-resources块(在Java 7中引入),它将自动为您关闭资源。
以下是您发布的等效代码,使用try-with-resource块重写:
try(PreparedStatement ps = conn.createStatement(myQueryString))
{
ResultSet rs = ps.executeQuery();
// process the results...
} catch(SQLException e) {
log.error("an error!", e);
throw new MyAppException("I'm sorry. Your query did not work.");
}
注意:
没有必要在这里调用ResultSet上的close()
,因为根据Statement.close()
doc:
当Statement对象关闭时,它的当前ResultSet对象(如果存在)也将关闭。
答案 2 :(得分:1)
有几种方法可以做到这一点。
首先是最简单的,如果您使用的是Java 7,那么就像其他答案中提到的那样实现try-with-resource。
第二种方法是你可以在finally
块中添加try / catch。建议先关闭ResultSet
,然后关闭Statement
,最后关闭Connection
。
finally {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
}
第三种方式是使用外部库,例如Commons DbUtils来处理所有关闭。
finally {
org.apache.commons.dbutils.DbUtils.closeQuietly(rs);
org.apache.commons.dbutils.DbUtils.closeQuietly(ps);
}