据说在使用后关闭所有JDBC资源是一个好习惯.但是,如果我有以下代码,是否有必要关闭Resultset和Statement?
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) {};
}
Run Code Online (Sandbox Code Playgroud)
问题是连接的关闭是否完成了工作,或者是否使用了一些资源.
Pau*_*aul 191
你所做的是完美和非常好的练习.
我说它的良好实践的原因...例如,如果由于某种原因你使用"原始"类型的数据库池并且你调用connection.close(),连接将返回到池并且ResultSet/ Statement将永远不会被关闭然后你会遇到很多不同的新问题!
所以你不能总是指望connection.close()清理.
我希望这有帮助 :)
Raú*_*udo 114
借助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.
}
}
Run Code Online (Sandbox Code Playgroud)
这种语法非常简洁和优雅.connection即使statement无法创建,也会被关闭.
dog*_*ane 69
来自javadocs:
关闭
Statement对象时,其当前ResultSet对象(如果存在)也将关闭.
然而,的Javadoc不是是否很清晰Statement,并ResultSet在关闭底层被关闭Connection.他们只是声明关闭连接:
立即释放此
Connection对象的数据库和JDBC资源,而不是等待它们自动释放.
在我看来,总是明确地关闭ResultSets,Statements而Connections当你与他们完成作为实现的close可能数据库驱动程序之间变化.
您可以通过使用诸如节省大量的锅炉板代码closeQuietly在DBUtils Apache的.
小智 37
我现在正在使用Oracle和Java.在这里我的观点:
您应该关闭ResultSet并Statement明确表示,因为Oracle在关闭连接后仍保持游标保持打开状态.如果不关闭ResultSet(光标),则会抛出超出最大打开游标的错误.
我想您可能会遇到与您使用的其他数据库相同的问题.
完成后,这是教程Close ResultSet:
完成后关闭ResultSet
ResultSet一旦完成ResultSet对象的处理就关闭对象,即使Statement对象在关闭ResultSet时隐式关闭 对象,ResultSet显式关闭ResultSet也会让垃圾收集器尽可能早地重新收集内存,因为对象可能会占用大量内存,具体取决于查询.
ResultSet.close();
如果你想要更紧凑的代码,我建议使用Apache Commons DbUtils.在这种情况下:
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 {
DbUtils.closeQuietly(rs);
DbUtils.closeQuietly(stmt);
DbUtils.closeQuietly(conn);
}
Run Code Online (Sandbox Code Playgroud)
不,您不需要关闭任何东西,但连接。每个 JDBC 规范关闭任何更高的对象将自动关闭更低的对象。ClosingConnection将关闭Statement连接创建的任何s。关闭 anyStatement将关闭ResultSet由 that 创建的所有s Statement。是否Connection可池化无关紧要。即使是可池连接也必须在返回池之前清理。
当然,您可能在Connection创建大量语句时有很长的嵌套循环,然后关闭它们是合适的。我几乎从不关闭ResultSet,关闭Statement或Connection将关闭它们时似乎过度。