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

2022-08-31 05:16:04

据说使用后关闭所有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) {};
}

问题是关闭连接是否完成了这项工作,或者它是否留下了一些资源在使用中。


答案 1

你所做的是完美的,非常好的练习。

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

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

我希望这有助于:)


答案 2

Java 1.7 使我们的生活更加轻松,这要归功于 try-with-resources 语句

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.
    }
}

这种语法非常简短和优雅。即使无法创建,也确实会被关闭。connectionstatement


推荐