使用JDBC Connection和PreparedStatement进行Java 7异常处理?

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)

Mar*_*eel 7

试,与资源只是调用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在创建它的块catchfinally块中使用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)