关闭资源的订单

时间:2013-05-28 20:06:17

标签: java sql database jdbc resources

我应该在连接之前关闭语句吗?而声明前的结果集? 或者它是否完全相反?

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

5 个答案:

答案 0 :(得分:7)

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

换句话说,以后进先出的方式关闭所有内容。

答案 1 :(得分: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将为您处理它,它将以相反的顺序关闭资源。另请参阅Oracle tutorial on try-with-resources

  

请注意,资源的“关闭”方法是在其创建的相反顺序中调用的。

您可以在文章Better Resource Management with Java SE 7: Beyond Syntactic Sugar

中更深入地了解资源试用。

Java 7的Java语言规范在14.20.3部分提到:

  

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

     

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

这也可以看作是一种明确的迹象,表明Java语言设计者考虑按照分配规范的相反顺序关闭资源。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

第一个例子是正确的方法。任何其他订单的问题在于,关闭Statement也会自动关闭任何基础ResultSet(同样可能会发生Connection) - 因此您需要关闭最低的close()层次结构首先。

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

答案 4 :(得分:0)

要以最小的努力解决这个问题,请尝试使用Java 7的新A.R.M. (自动资源管理)块,也称为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