我应该先关闭哪个,即准备语句还是连接?

2022-09-01 15:31:06

在 JDBC 中使用 时,我应该关闭第一个还是第一个?我刚刚看到了一个代码示例,其中首先关闭了,但在我看来,关闭第一个代码似乎更合乎逻辑。PreparedStatementPreparedStatementConnectionConnectionPreparedStatement

有没有一种标准的,公认的方法来做到这一点?这重要吗?关闭 是否也会导致 关闭,因为 与对象直接相关?ConnectionPreparedStatementPreparedStatementConnection


答案 1

语句。我希望你关闭(按顺序)

  1. 结果集
  2. 语句
  3. 连接

(并在此过程中检查空值!

即以相反的顺序接近开场序列。

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


答案 2

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

  • ResultSet
  • PreparedStatement
  • 这。Connection

此外,建议在 close 中关闭所有与 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());
        }
}

您可以看到我已经检查了我的对象是否为空,对于连接,请首先检查连接是否未自动提交。许多人未能检查它,并意识到交易尚未提交到数据库。


推荐