![](/img/trans.png)
[英]Where to close java PreparedStatements and 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.