Java 7 Automatic Resource Management JDBC (try-with-resources statement)

前端 未结 3 1059
长发绾君心
长发绾君心 2020-12-01 00:39

How to integrate the common JDBC idiom of creating/receiving a connection, querying the database and possibly processing the results with Java 7\'s automatic resource manage

相关标签:
3条回答
  • 2020-12-01 01:27

    If you want to use pooled connection in transaction, you should use it in this way:

    try (Connection conn = source.getConnection()) {
            conn.setAutoCommit(false);
            SQLException savedException = null;
            try {
                // Do things with connection in transaction here...
                conn.commit();
            } catch (SQLException ex) {
                savedException = ex;
                conn.rollback();
            } finally {
                conn.setAutoCommit(true);
                if(savedException != null) {
                    throw savedException;
                }
            }
        } catch (SQLException ex1) {
            throw new DataManagerException(ex1);
        }
    

    This sample code handles setting autocommit values.

    NOTE, that using savedException does save exception in case that conn.rollback() throws another. This way, finally block will throw "right" exception.

    0 讨论(0)
  • 2020-12-01 01:37
    try(Connection con = getConnection()) {
       try (PreparedStatement prep = con.prepareConnection("Update ...")) {
           //prep.doSomething();
           //...
           //etc
           con.commit();
       } catch (SQLException e) {
           //any other actions necessary on failure
           con.rollback();
           //consider a re-throw, throwing a wrapping exception, etc
       }
    }
    

    According to the oracle documentation, you can combine a try-with-resources block with a regular try block. IMO, the above example captures the correct logic, which is:

    • Attempt to close the PreparedStatement if nothing goes wrong
    • If something goes wrong in the inner block, (no matter what is is) roll back the current transaction
    • Attempt to close the connection no matter what
    • If something goes wrong closing the connection, you can't rollback the transaction (as that's a method on the connection, which is now in indeterminate state), so don't try

    In java 6 and earlier, I would do this with a triply nested set of try blocks (outer try-finally, middle try-catch, inner try-finally). ARM syntax does make this terser.

    0 讨论(0)
  • 2020-12-01 01:37

    IMO, declaring Connection and PreparedStatement outside try-catch is the best way available in this case.

    0 讨论(0)
提交回复
热议问题