Ash*_*iya 2 java exception-handling exception jdbc java-7
在以下代码片段中,
1)在调用"conn.close()"(通过AutoClose)之前,try-catch块是否自动调用"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;
}
}
Run Code Online (Sandbox Code Playgroud)
一试,与资源只是调用close()的方法Connection.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;
}
}
Run Code Online (Sandbox Code Playgroud)
既然你不能conn在创建它的块catch或finally块中使用try它,你也可以嵌套它:
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();
}
}
Run Code Online (Sandbox Code Playgroud)