簡體   English   中英

關閉Java PreparedStatement和ResultSets

[英]Close java PreparedStatement and ResultSets

下面的代碼無法編譯,因為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();
}

利用Java 7中引入的新功能, try-with-resources語句

例如...

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塊(在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.");
}

注意:
根據Statement.close()文檔,此處不必在ResultSet上調用close()

當Statement對象關閉時,其當前ResultSet對象(如果存在)也將關閉。

有幾種方法可以做到這一點。

首先,也是最簡單的,如果您使用的是Java 7,則按照其他答案中所述實現try-with-resource

第二種方式,你可以再補充一個try / catch到finally塊。 建議先關閉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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM