Что мне сначала закрыть, PreparedStatement или Connection? - PullRequest
25 голосов
/ 02 марта 2010

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

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

Ответы [ 2 ]

40 голосов
/ 02 марта 2010

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

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

(и проверяйте наличие нулей по пути!)

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

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

7 голосов
/ 02 марта 2010

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

  • ResultSet
  • PreparedStatement
  • Connection.

Кроме того, желательно закрыть все связанные с JDBC объекты в finally close, чтобы гарантировать закрытие.

//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 , если соединение не автокоммитировано. Многие люди не могут это проверить и понимают, что транзакция не была передана в БД.

...