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

时间:2010-03-02 14:30:47

标签: java jdbc connection prepared-statement

在JDBC中使用PreparedStatement时,我应先关闭PreparedStatement还是先关闭Connection?我刚刚看到了Connection首先关闭的代码示例,但在我看来首先关闭PreparedStatement更合乎逻辑。

是否有标准的,可接受的方式来执行此操作?有关系吗?关闭Connection是否还会导致PreparedStatement关闭,因为PreparedStatementConnection对象直接相关?

2 个答案:

答案 0 :(得分:40)

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

  1. 结果集
  2. 声明
  3. 连接
  4. (并检查沿途的空值!)

    即。以反向顺序关闭到开场序列。

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

答案 1 :(得分:7)

应按顺序完成以下程序

  • ResultSet
  • PreparedStatement
  • Connection

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

//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());
        }
}

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