簡體   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