Java 结束语

Java closing Statement

我不确定,哪种方法更好?

con.createStatement().execute("...");

Statement st = con.createStatement();
st.execute("...");
st.close();

使用第一种方法时,语句create是关闭还是保持打开状态?我确定在第二种方法中语句将被关闭,但在第一种方法中呢?有人知道吗?

在第一个片段中,您没有明确关闭语句,因此您不能指望它被关闭。一些驱动程序的实现在语句的 finalize() 方法中调用 close(),但你不应该依赖它,并且应该始终显式关闭你的语句。

con.createStatement().execute("...");Statement st = con.createStatement(); 意思相同。但是关闭语句不是用第一种方法执行的。关闭 ResultSetStatement 是一个好习惯。您可能会遇到未关闭 Statements 的其他问题。您可以改为关闭 Connection,但在使用连接池时这是不可能的。另外第二种方法在使用PrepairedStatement时非常有用,因为它可以给PreparedStatement.

设置参数

如果您没有明确关闭 Statement 对象,那么它将保持打开状态,至少在开始时是这样。它 可能 在垃圾收集器确定它无法访问后的某个时间关闭,如果发生这种情况的话。它在连接关闭时关闭,如果那时它仍然打开。

最佳形式通常是:

Statement st = con.createStatement();

try {
    // ...
    st.execute("...");
    // ...
} finally {
    st.close();
}

通过在创建语句后立即启动 try 块,您可以确保该语句在超出范围之前将被关闭(在 finally 块中)——即使在某处抛出任意异常。

两者都不好,尽管第二种选择比第一种更好。当你完成时,你应该总是关闭一个声明(不是很快,但绝对不是永远不会)。您的第二个替代方案尝试关闭该语句,但如果 execute 抛出异常,则实际上不会这样做。

要保证语句的结束,您可以使用 try-with-resource(在 Java 7 中介绍):

try (Statement statement = connection.createStatement) {
    statement.execute();
    // Other things you want to with statement...
}

如果您不幸卡在 Java 6 或更早版本,您需要使用 try/finally:

Statement statement = connection.createStatement();
try {
    statement.execute();
    // Other things you want to with statement...
} finally {
    statement.close();
}