小编典典

JDBC结果集和语句必须单独关闭,尽管连接在之后关闭?

java

尽管随后关闭了连接,是否必须分别关闭JDBC结果集和语句?据说在使用后关闭所有JDBC资源是一个好习惯。但是,如果我有以下代码,是否有必要关闭结果集和语句?

Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
    conn = // Retrieve connection
    stmt = conn.prepareStatement(// Some SQL);
    rs = stmt.executeQuery();
} catch(Exception e) {
    // Error Handling
} finally {
    try { if (rs != null) rs.close(); } catch (Exception e) {};
    try { if (stmt != null) stmt.close(); } catch (Exception e) {};
    try { if (conn != null) conn.close(); } catch (Exception e) {};
}

问题是连接的关闭是否可以完成任务,或者它是否使某些资源处于使用状态。


阅读 752

收藏
2020-03-10

共2个答案

小编典典

你所做的是完美且非常好的做法。

我说这是一个好的做法的原因……例如,如果由于某种原因你正在使用“原始”类型的数据库池并调用connection.close(),则连接将返回到池中,并且ResultSet/ Statement将永远不会关闭,然后你会遇到许多不同的新问题!

因此,你不能总是指望connection.close()进行清理。

2020-03-10
小编典典

借助try-with-resources语句, Java 1.7使我们的生活更加轻松。

try (Connection connection = dataSource.getConnection();
    Statement statement = connection.createStatement()) {
    try (ResultSet resultSet = statement.executeQuery("some query")) {
        // Do stuff with the result set.
    }
    try (ResultSet resultSet = statement.executeQuery("some query")) {
        // Do more stuff with the second result set.
    }
}

此语法非常简短而优雅。而且connection的确会即使在关闭时,statement不能创建。

2020-03-10