Подтвердить что ты не робот

Который я должен закрыть первым, PreparedStatement или Connection?

При использовании PreparedStatement в JDBC мне нужно сначала закрыть PreparedStatement или Connection? Я просто видел образец кода, в котором сначала закрывается Connection, но мне кажется логичным сначала закрыть PreparedStatement.

Есть ли стандартный, принятый способ сделать это? Это имеет значение? Закрывает ли Connection закрытие PreparedStatement, так как PreparedStatement напрямую связан с объектом Connection?

4b9b3361

Ответ 1

Утверждение. Я ожидаю, что вы закроете (по порядку)

  • набор результатов
  • утверждение
  • соединение

(и проверить нули в пути!)

то есть. закрыть в обратном порядке до последовательности открытия.

Если вы используете Spring JdbcTemplate (или подобное), то это будет за вами. В качестве альтернативы вы можете использовать Apache Commons DbUtils и DbUtils.close() или DbUtils.closeQuietly().

Ответ 2

Следующие процедуры должны быть выполнены (в порядке)

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

Вы можете видеть, что я проверил, являются ли мои объекты пустыми и для подключения, проверьте first, если соединение не автокомментировано. Многие люди не могут проверить это и понять, что транзакция не была передана БД.