提问者:小点点

JDBC Resultsets和Statements是否必须单独关闭,尽管连接在之后关闭?


据说使用后关闭所有JDBC资源是一个好习惯。 但是如果我有下面的代码,有必要关闭Resultset和语句吗?

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) {};
}

问题是连接的关闭是否完成了任务,还是会留下一些资源在使用中。


共3个答案

匿名用户

你所做的是完美的,非常好的实践。

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

所以不能总是指望connection.clos()来清理。

我希望这能有所帮助:)

匿名用户

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

这个语法相当简洁优雅。 而连接将确实关闭,即使在无法创建语句时也是如此。

匿名用户

来自Javadocs:

语句对象关闭时,其当前的ResultSet对象(如果存在)也将关闭。

但是,javadocs并不十分清楚当您关闭底层的连接语句resultset是否关闭。 它们只是说关闭连接:

立即释放此连接对象的数据库和JDBC资源,而不是等待它们自动释放。

我认为,在完成resultset语句connections时,始终要显式地关闭它们,因为close的实现可能因数据库驱动程序而异。

通过在Apache的DBUtils中使用诸如closewility之类的方法,可以为自己节省大量的模板代码。