2013-03-28 30 views
2

在以下代码片段中,使用JDBC Connection和PreparedStatement进行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; 
     } 
    } 

回答

7

一个试穿与资源就叫上Connectionclose()方法。调用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(); 
    } 
} 
+0

感谢anwer.sorry我忘了在foo()中添加commit()。bar()方法中创建的PreparedStatement何时关闭? –

+0

在链接中说:“注意:try-with-resources语句可以像普通的try语句一样捕获并最终阻塞。在try-with-resources语句中,任何catch或finally块都在资源声明后运行已关闭。“那么我应该在哪里调用“conn.rollback()”?我在调用“conn.close()”后无法调用它,可以吗? –

+1

你说得对,我搞混了。但是,由于您无法访问catch或finally块中的尝试(包括资源)中创建的对象,因此在这种特定情况下这并不相关。 (我删除了我以前的评论,所以我不会混淆别人,链接是:http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) –