public void XXX(){
Connection conn = ~~;
CallableStatement cstmt = conn.prepareCall("{call XXX");
cstmt.executeUpdate();
cstmt.close();
}
CallableStatement的所有方法都是通过上述方法逐行描述的close()。 不能通过自动操作怎么做close()在每个方法中完成?
是否存在可以用java5或java6实现的方法?
请告诉我一个更好的表达,因为,我是日本人。
答案 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