Java 新的jre7 try块资源
如果我做了类似的事情Java 新的jre7 try块资源,java,try-catch,java-7,Java,Try Catch,Java 7,如果我做了类似的事情 try ( Connection conn = Database.getConnection(); PreparedStatement ps = conn.prepareStatement("SELECT * FROM table WHERE something = ? LIMIT 1"); ) { ps.setString(1, "hello world"); ResultSet result
try (
Connection conn = Database.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM table WHERE something = ? LIMIT 1");
) {
ps.setString(1, "hello world");
ResultSet results = ps.executeQuery();
if(results.next()) {
// blah
}
} catch(SQLException e) {
e.printStackTrace();
}
当PreparedStatement关闭时,ResultSet是否仍将关闭,或者我是否仍需要显式关闭ResultSet?始终作为一种良好的做法,尝试关闭您的ResultSet和PreparedStatements。在最后一个街区。每次都要管理异常,这样您就不会让资源无人看管(这是一个常见的泄漏源) 除非将它们注入方法,否则调用方法可能需要它们 编辑:站直。如果resultset是作为try with resource创建的,则将随您的PS一起消亡。根据方法的JavaDoc: 注意:关闭语句对象时,其当前ResultSet对象(如果存在)也将关闭 因此,回答您的问题-是的,
ResultSet
将在您的案例中自动关闭,因为相关的语句
在try with resources
块中关闭
但是,请注意,显式关闭ResultSet
s是一种良好的做法,建议您遵循,因此您修改后的代码如下所示:
“在最后一个街区。每一次。”不是真的。
try with resources
的要点是,您不必这样做,但是在他的情况下,它不适用于ResultSet
。prepareStatement方法的签名中是否应该抛出异常,我认为SQLException?@tomasz_kusmierczyk是的,您是对的-编辑了我的答案。谢谢请参阅,以了解始终显式关闭结果集(或使用try with resources语法关闭结果集)的其他原因。JDBC驱动程序、连接池和数据库中常见的设计限制和错误都会导致未关闭的结果集出现问题。
try (
Connection conn = Database.getConnection();
PreparedStatement ps = prepareStatement(conn, "SELECT * FROM table WHERE something = ? LIMIT 1", param);
ResultSet results = ps.executeQuery();
) {
if(results.next()) {
// blah
}
} catch(SQLException e) {
e.printStackTrace();
}
private static PreparedStatement prepareStatement(Connection connection, String sql, String param) throws SQLException {
final PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, param);
return ps;
}