关闭java PreparedStatement和ResultSet
下面的代码不会编译,因为PreparedStatement.close()和ResultSet.close()都会引发java.sql.SQLException。那么,我应该在finally子句中添加try/catch块吗?或者将close语句移到try子句中?或者干脆不打电话给close关闭java PreparedStatement和ResultSet,java,mysql,jdbc,Java,Mysql,Jdbc,下面的代码不会编译,因为PreparedStatement.close()和ResultSet.close()都会引发java.sql.SQLException。那么,我应该在finally子句中添加try/catch块吗?或者将close语句移到try子句中?或者干脆不打电话给close PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.createStatement(myQueryString); rs
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();
}
利用Java 7中引入的新特性 例如
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.");
}
利用Java 7中引入的新特性 例如
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.");
}
使用try with resources块(在Java7中引入),它将自动为您关闭资源 以下是您发布的等效代码,使用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.");
}
注:不必在此处对结果集调用
close()
,因为根据文档:
关闭语句对象时,其当前ResultSet对象(如果存在)也将关闭
使用try with resources块(在Java7中引入),它将自动为您关闭资源 以下是您发布的等效代码,使用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.");
}
注:不必在此处对结果集调用
close()
,因为根据文档:
关闭语句对象时,其当前ResultSet对象(如果存在)也将关闭
有几种方法可以做到这一点 首先也是最简单的,如果您使用的是Java7,那么就按照其他答案中提到的实现 第二种方法是,只需将try/catch添加到
finally
块。建议首先关闭结果集
,然后关闭语句
,最后关闭连接
finally {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
}
第三种方法是使用外部库,例如为您处理所有关闭
finally {
org.apache.commons.dbutils.DbUtils.closeQuietly(rs);
org.apache.commons.dbutils.DbUtils.closeQuietly(ps);
}
有几种方法可以做到这一点 首先也是最简单的,如果您使用的是Java7,那么就按照其他答案中提到的实现 第二种方法是,只需将try/catch添加到
finally
块。建议首先关闭结果集
,然后关闭语句
,最后关闭连接
finally {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
}
第三种方法是使用外部库,例如为您处理所有关闭
finally {
org.apache.commons.dbutils.DbUtils.closeQuietly(rs);
org.apache.commons.dbutils.DbUtils.closeQuietly(ps);
}