关闭java PreparedStatement和ResultSet

时间:2016-01-20 02:22:56

标签: java mysql jdbc

下面的代码无法编译,因为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();
}

3 个答案:

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