Which should I close first, the PreparedStatement or the Connection?

后端 未结 2 1684
夕颜
夕颜 2020-12-29 05:28

When using a PreparedStatement in JDBC, should I close the PreparedStatement first or the Connection first? I just saw a code sample i

相关标签:
2条回答
  • 2020-12-29 05:55

    The statement. I would expect you to close (in order)

    1. the result set
    2. the statement
    3. the connection

    (and check for nulls along the way!)

    i.e. close in reverse order to the opening sequence.

    If you use Spring JdbcTemplate (or similar) then that will look after this for you. Alternatively you can use Apache Commons DbUtils and DbUtils.close() or DbUtils.closeQuietly().

    0 讨论(0)
  • 2020-12-29 06:06

    The following procedures should be done (in order)

    • The ResultSet
    • The PreparedStatement
    • The Connection.

    Also, it's advisable to close all JDBC related objects in the finally close to guarantee closure.

    //Do the following when dealing with JDBC. This is how I've implemented my JDBC transactions through DAO....
    
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    
    try {
      conn = ....
      ps = conn.prepareStatement(...);
    
      //Populate PreparedStatement
      rs = ps.executeQuery();
    
    } catch (/*All relevant exceptions such as SQLException*/Exception e) {
      logger.error("Damn, stupid exception: " , e);
    } finally {
    if (rs != null) {
                try {
                    rs.close();
                    rs = null;
                } catch (SQLException e) {
                    logger.error(e.getMessage(), e.fillInStackTrace());
                }
            }
    
            if (ps != null) {
                try {
                    ps.close();
                    ps = null;
                } catch (SQLException e) {
                    logger.error(e.getMessage(), e.fillInStackTrace());
                }
            }
    
            try {
                if (conn!= null && !conn.isClosed()){
                    if (!conn.getAutoCommit()) {
                        conn.commit();
                        conn.setAutoCommit(true);
                    }
                    conn.close();
                    conn= null;
                }
            } catch (SQLException sqle) {
                logger.error(sqle.getMessage(), sqle.fillInStackTrace());
            }
    }
    

    You can see I've checked if my objects are null and for connection, check first if the connection is not autocommited. Many people fail to check it and realise that the transaction hasn't been committed to DB.

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