Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭java PreparedStatement和ResultSet_Java_Mysql_Jdbc - Fatal编程技术网

关闭java PreparedStatement和ResultSet

关闭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.close()和ResultSet.close()都会引发java.sql.SQLException。那么,我应该在finally子句中添加try/catch块吗?或者将close语句移到try子句中?或者干脆不打电话给close

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);
}