2
public void XXX(){
    Connection conn = ~~;        
    CallableStatement cstmt = conn.prepareCall("{call XXX");
    cstmt.executeUpdate();
    cstmt.close();
}

CallableStatement 的所有方法在 close() 中都按照上述方法逐行描述。无法通过自动操作在每个方法中执行 close() 吗?

java5或java6能实现的方法有吗?

请告诉我一个更好的表达方式,因为,我是日本人。

4

2 回答 2

3

尝试资源

现代方法使用 Java 7 中添加的 try-with-resources 功能。这里的“资源”是指使用其单一方法实现AutoCloseableclose接口的类的任何对象。请参阅Oracle 教程

try-with-resources 语法在 the 和它的花括号之间插入一对try括号。在这些括号中,您声明并初始化您的资源对象。您可以在这些括号中拥有多个资源。每个资源都在语句行上声明和初始化。每一行都以分号结束,就像任何 Java 语句一样,尽管最后一个分号是可选的。

try (
    Connection conn = myDataSource.getConnection() ;
    Callable cstmt = conn.prepareCall( sql ) ;
) {
    cstmt.executeUpdate() ;
} catch ( … ) {
    …
}

顺便说一句,在 Java 9 及更高版本中,您可以在代码的更早部分在括号之外声明和初始化您的资源对象。在这种情况下,只需将资源的变量名放在括号内即可自动关闭。

请注意,我们不需要为finally. close即使在某个时候抛出异常,try-with-resources 也会调用任何成功实例化的资源。资源按照声明它们的相反顺序关闭。

于 2019-05-29T00:22:49.357 回答
1

关闭数据库对象应始终在 finally 块中完成,以便无论是否发生异常,它们都会关闭。

Connection c = null;
CallableStatement cstmt = null;

try {
    conn = getAConnectionSomewhere();  
    cstmt = conn.prepareCall("{call XXX");
    cstmt.executeUpdate();
} finally {
    IOUtils.close(cstmt);
    IOUtils.close(conn);
}

在这里,我冒昧地使用了来自 commons-io 的 IOUtils

于 2011-02-01T05:13:06.850 回答