我应该在连接之前关闭语句吗?而声明前的结果集? 或者它是否完全相反?
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();
}
答案 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)
ResultSet
,Statement
,然后是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