我应该首先关闭哪个,PreparedStatement还是Connection?

fro*_*die 25 java connection jdbc prepared-statement

PreparedStatement在JDBC中使用时,我应该关闭第PreparedStatement一个还是第Connection一个?我刚刚看到一个代码示例,其中Connection首先关闭它,但在我看来更合乎逻辑地关闭第PreparedStatement一个.

是否有标准的,可接受的方式来做到这一点?有关系吗?关闭Connection也会导致PreparedStatement关闭,因为PreparedStatement它与Connection对象直接相关吗?

Bri*_*new 40

该声明.我希望你关闭(按顺序)

  1. 结果集
  2. 该声明
  3. 连接

(并检查沿途的空值!)

即以与开启顺序相反的顺序关闭.

如果你使用Spring JdbcTemplate(或类似的),那么它将为你照顾.或者,您可以使用Apache Commons DbUtilsDbUtils.close()or DbUtils.closeQuietly().

  • 那是对的.要点:在获得它们时以**颠倒顺序关闭*资源*. (13认同)
  • 的确。某些 JDBC 驱动程序会在连接关闭后关闭结果集或语句时引发异常。 (2认同)

Buh*_*ndi 7

应该完成以下程序(按顺序)

  • ResultSet
  • PreparedStatement
  • Connection.

此外,建议关闭所有与JDBC相关的对象finally以保证闭包.

//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());
        }
}
Run Code Online (Sandbox Code Playgroud)

您可以看到我已检查我的对象是否为空并且是否为连接,请首先检查连接是否未自动更新.许多人未能检查它并意识到事务尚未提交给DB.

  • 所有这些最终样板应该压缩成实用程序方法(例如`DBUtils.close(rs,ps,conn);`).关于自动提交的建议也取决于具体情况.有时当有异常时你根本不想提交.此外,显式设置null引用的工作几乎总是不需要的,因为它会在方法退出时被取消引用,希望在此之后不久,否则该方法可能太长. (6认同)