Который я должен закрыть сначала, PreparedStatement или Соединение?

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

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

25
задан Harry Johnston 2 May 2014 в 01:45
поделиться

2 ответа

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

  1. набор результатов
  2. утверждение
  3. соединение

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

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

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

40
ответ дан 28 November 2019 в 20:57
поделиться

Необходимо выполнить следующие процедуры (по порядку)

  • ResultSet
  • PreparedStatement
  • Соединение .

Также рекомендуется закрыть все объекты, связанные с 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());
        }
}

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

7
ответ дан 28 November 2019 в 20:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: