Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JDBC连接和PreparedStatement处理Java 7异常?_Java_Exception_Jdbc_Exception Handling_Java 7 - Fatal编程技术网

使用JDBC连接和PreparedStatement处理Java 7异常?

使用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

在下面的代码段中

1) try-catch块是否在调用“conn.close()”(通过自动关闭)之前自动调用“conn.rollback()”? 如果没有,我是否必须向该块添加
最后{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
的关闭无关
,这是您的第一条评论要求的。并且,根据范围规则,您甚至无法在关闭
连接后调用这些方法。