4

我应该在连接之前关闭语句吗?和声明之前的结果集?还是完全相反?

Connection conn = null;
Statement st = null;
Resultset rs = null;

try {
    // Do stuff

} catch (SQLException e) {
    // Do stuff
}
finally {
    if (rs != null) rs.close();
    if (st != null) st.close();
    if (conn != null) conn.close();         
}

或者

Connection conn = null;
Statement st = null;
Resultset rs = null;

try {
    // Do stuff

} catch (SQLException e) {
    // Do stuff
}
finally {
    if (conn != null) conn.close();         
    if (st != null) st.close();
    if (rs != null) rs.close();
}
4

5 回答 5

7

关闭结果集,然后是语句,然后是连接。

换句话说,在后进先出的基础上关闭一切。

于 2013-05-28T20:08:51.233 回答
4

您应该以与打开顺序相反的顺序关闭资源(就像这些资源在堆栈上一样)。

使用 Java 7 try-with-resources,理想的方法是:

try (
   Connection conn = somethingThatGetsAConnection();
   Statement st = conn.createStatement();
   Resultset rs = st.executeQuery("SELECT something");
) {
    // Do stuff

} catch (SQLException e) {
    // Do stuff
}

Java 会为你处理好它,它会以相反的顺序关闭资源。另请参阅有关 try-with-resources 的 Oracle 教程

请注意,资源的“关闭”方法以与其创建相反的顺序被调用。

您可以在使用 Java SE 7 更好的资源管理:超越语法糖一文中找到对 try-with-resources 的更深入了解

Java 7 的 Java 语言规范在14.20.3节中提到:

资源按从左到右的顺序初始化。如果资源初始化失败(即其初始化表达式抛出异常),那么到目前为止由try-with-resources 语句初始化的所有资源都将关闭。如果所有资源初始化成功,则块正常执行,然后关闭 -with-resources 语句的try所有非空资源。try

资源以与它们初始化时相反的顺序关闭。仅当资源初始化为非空值时才关闭资源。关闭一个资源的异常不会阻止关闭其他资源。

这也可以看作是 Java 语言设计者考虑按照与分配规范相反的顺序关闭资源的明确指示。

于 2013-05-28T20:20:33.727 回答
0

第一个例子是正确的方法。任何其他订单的问题是关闭 aStatement也会自动关闭任何底层证券ResultSet(a 也可能发生同样的情况Connection) - 所以您需要先关闭层次结构中最低的一个。

正如@aubin 指出的那样,这些close()方法可能会抛出一个。SQLException解决这个问题的一个简单方法是使用关闭它们的方法 - 然后你甚至不需要空检查!DBUtils closeQuietly()

于 2013-05-28T20:15:43.693 回答
0

要以最小的努力解决这个问题,请尝试使用 Java 7 的新 ARM(自动资源管理)块,也称为 Try-With-Resources。

try (Connection conn = null, Statement st = null, ResultSet rs = null){
    // Do stuff

} catch (SQLException e) {
    // Do stuff
}

无需丑陋Finally或担心正确的顺序,Java 会为您处理。

有关 ARM/Try-With-Resources 块的更多信息:http: //docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

于 2013-05-28T20:22:27.563 回答
0

ResultSetStatement然后是Connection。JDBC 连接和语句的黄金法则是以启动或打开的相反顺序关闭。另外,ResultSet依赖于执行,Statement依赖StatementConnection实例。因此,关闭应按该顺序(ResultSet、Statement、Connection)发生。

于 2013-05-28T20:11:06.743 回答