【发布时间】:2018-03-10 02:55:55
【问题描述】:
这个问题应该很简单,可能会很烦人,但我仍然对使用 Java 关闭结果集表示怀疑。应该为每个语句或结果集做应该只在最终关闭?
try {
Class.forName(<driver class>);
con = DriverManager.getConnection(
"IP",
"username",
"password");
for(String dealId : items) {
String sql= "SQL Query";
preparedStatement = con.prepareStatement(sql);
rs = preparedStatement.executeQuery();
while(rs.next()) {
count += rs.getInt("total");
}
// Result should be closed here as the statement got executed?
}
System.out.println(count);
if(items.size() == count) {
dealsBelongToTheParty = true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
rs.close(); // Or this is right?
preparedStatement.close();
if(!con.isClosed())
con.close();
}
【问题讨论】:
-
最好在 finally 块中完成
-
使用 try-with-resource 会更好
-
您似乎在
for循环的每次迭代中创建了一个新结果集。在这种情况下,合乎逻辑的做法是关闭 for 循环中的每一个,而不是只关闭最后剩下的任何一个。 -
在一个 finally 块中塞满多个 close 语句是一个非常糟糕的主意。你会导致连接泄漏。
-
您正在泄漏 ResultSets 和 PreparedStatements。您应该在每次循环时都关闭它们。幸运的是,如果您使用的是完全兼容的 JDBC 驱动程序,那么当您关闭语句时,它们都会关闭。但这对于所有目的来说可能还不够快。