[英]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;
}
}
由於您不能在創建它的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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.