关闭CallableStatement

时间:2011-02-01 02:41:45

标签: java jdbc callable-statement

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

CallableStatement的所有方法都是通过上述方法逐行描述的close()。 不能通过自动操作怎么做close()在每个方法中完成?

是否存在可以用java5或java6实现的方法?

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

2 个答案:

答案 0 :(得分:1)

尝试资源

现代方法使用Java 7中添加的try-with-resources功能。这里的“资源”是指使用单一方法close实现AutoCloseable接口的类的任何对象。参见Oracle Tutorial

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

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

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

请注意,我们无需打扰finally。 try-with-resources将在成功实例化的任何资源上调用close,即使在某个时刻抛出异常也是如此。资源以声明它们的相反顺序关闭。

答案 1 :(得分:0)

关闭数据库对象应该始终在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

相关问题