繁体   English   中英

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

[英]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;
    }
}

由于您不能在创建它的trycatchfinally块中使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM