Как часто должны быть закрыты Connection, Statement и ResultSet в JDBC? - PullRequest
4 голосов
/ 09 апреля 2011

Нужно ли их закрывать после каждого запроса и инициализировать в начале каждого запроса?

Ответы [ 2 ]

9 голосов
/ 09 апреля 2011

Всегда .Вам необходимо приобрести и закрыть их в кратчайшем объеме 1004 *, чтобы избежать утечки ресурсов, проблем с транзакциями и исчерпанных пулов соединений.Невыполнение этого требования приведет к тому, что в БД рано или поздно закончатся ресурсы, что приведет к исключениям типа «Слишком много соединений».

Обычная идиома JDBC следующая: все ресурсы и открываются в одном и том же блоке try-with-resources :

public List<Entity> list() throws SQLException {
    List<Entity> entities = new ArrayList<Entity>();

    try (
        Connection connection = database.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_LIST);
        ResultSet resultSet = statement.executeQuery();
    ) {
        while (resultSet.next()) {
            entities.add(map(resultSet));
        }
    }

    return entities;
}

Или когда вы еще не в Java 7:

public List<Entity> list() throws SQLException {
    List<Entity> entities = new ArrayList<Entity>();
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;

    try {
        connection = database.getConnection();
        statement = connection.prepareStatement(SQL_LIST);
        resultSet = statement.executeQuery();

        while (resultSet.next()) {
            entities.add(map(resultSet));
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }

    return entities;
}

Использование PreparedStatement даст вам преимущество кэширования операторов в БД (рядом с предотвращением внедрения SQL при правильном использовании).Получение и закрытие соединения является самой дорогой задачей, но там для этого изобретены пулы соединений.Если вы хотите повторно использовать тот же оператор для массовых вставок / обновлений, вы можете использовать пакеты.

См. Также:

0 голосов
/ 09 апреля 2011

Поскольку вам не нужны результаты предыдущего запроса, вам, конечно, нужно инициализировать ResultSet.

Оператор может быть сохранен, если необходимо снова, и особенно PreparedStatements должен быть сохранен - ​​они могут быть скомпилированы при первом запуске базой данных, что экономит несколько секунд:

"SELECT foo FROM bar WHERE a = ?" 

если, конечно, изменяется только параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...