[英]Java 7 exception handling with JDBC Connection and PreparedStatement?
在以下代码段中,
1)在调用“conn.close()”(通过AutoClose)之前,try-catch块是否自动调用“conn.rollback()”? 如果没有,我是否必须添加finally { conn.rollback(); }
finally { conn.rollback(); }
到那个方块?
2)Connection对象传入bar()方法的方式以及其中的try-catch方法是否正确?
public void foo() {
try (Connection conn = datasource.getConnection()) {
bar(conn, "arg");
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void bar(Connection conn, String args) throws SQLException {
try (PreparedStatement ps = conn.prepareStatement("SOME_QUERY")) {
// Do something
ps.executeUpdate();
} catch (SQLException err) {
throw err;
}
}
try-with-resources将仅在Connection
上调用close()
方法。 事务处于活动状态时调用Connection.close()
的效果由实现定义:
强烈建议应用程序在调用
close
方法之前显式提交或回滚活动事务。 如果调用close
方法并且存在活动事务,则结果是实现定义的。
换句话说:不要依赖它,而是显式调用commit()
或rollback()
因为实际的行为在驱动程序之间可能会有所不同,甚至在同一驱动程序的版本之间也可能有所不同。
考虑到您的示例,我建议:
public void foo() {
try (Connection conn = datasource.getConnection()) {
bar(conn, "arg");
} catch (SQLException e) {
e.printStackTrace();
}
}
public void bar(Connection conn, String args) throws SQLException {
try (PreparedStatement ps = conn.prepareStatement("SOME_QUERY")) {
// Do something
ps.executeUpdate();
conn.commit();
} catch (SQLException err) {
conn.rollback();
throw err;
}
}
由于您不能在创建它的try
的catch
或finally
块中使用conn
,因此也可以将其嵌套:
public void foo() {
try (Connection conn = datasource.getConnection()) {
try {
bar(conn, "arg");
conn.commit();
} catch (Exception ex) {
conn.rollback();
throw ex;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.