使用JDBC连接和PreparedStatement处理Java 7异常?
在下面的代码段中 1) try-catch块是否在调用“conn.close()”(通过自动关闭)之前自动调用“conn.rollback()”? 如果没有,我是否必须向该块添加使用JDBC连接和PreparedStatement处理Java 7异常?,java,exception,jdbc,exception-handling,java-7,Java,Exception,Jdbc,Exception Handling,Java 7,在下面的代码段中 1) try-catch块是否在调用“conn.close()”(通过自动关闭)之前自动调用“conn.rollback()”? 如果没有,我是否必须向该块添加最后{conn.rollback();} 2) 连接对象传入bar()方法的方式以及其中的try-catch方法是否正确 public void foo() { try (Connection conn = datasource.getConnection()) { bar(co
最后{conn.rollback();}
2) 连接对象传入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;
}
}
尝试使用资源只需调用连接上的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();
}
}
谢谢回答。对不起,我忘了在foo()中添加commit()。在bar()方法中创建的PreparedStatement何时关闭?链接中显示:注意:try with resources语句可以像普通try语句一样具有catch和finally块。在try-with-resources语句中,任何catch或finally块都是在声明的资源关闭后运行的。“那么我应该在哪里调用“conn.rollback()”?在调用“conn.close()”之后我不能调用它,可以吗?没错,我弄错了。但是,因为您无法访问try中创建的对象(包括资源)在catch或finally块中,这与此特定情况无关。(我删除了以前的注释,以免混淆其他人,链接是:)在任何情况下,调用commit()
或rollback()
与bar()中的PreparedStatement
的关闭无关
,这是您的第一条评论要求的。并且,根据范围规则,您甚至无法在关闭连接后调用这些方法。