Как часто соединение, заявление и ResultSet закрываются в JDBC?

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

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

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

public List list() throws SQLException { List entities = new ArrayList(); 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 list() throws SQLException { List entities = new ArrayList(); 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 даст вам преимущество кэширования БД операторов (рядом с предотrotationм внедрения SQL при правильном использовании). Приобретение и закрытие соединения – самая дорогая задача, но для этого созданы пулы соединений. Если вы хотите повторно использовать один и тот же оператор для массовых вставок / обновлений, вы можете использовать партии.

Смотрите также:

  • Когда мое приложение теряет связь, как мне его восстановить?
  • Можно ли использовать статический экземпляр java.sql.Connection в многопоточной системе?

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

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

 "SELECT foo FROM bar WHERE a = ?" 

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

  • Является ли java.sql.Timestamp конкретным часовым поясом?
  • Ошибка выполнения: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
  • ResultSet не закрыт при закрытии соединения?
  • oracle.jdbc.driver.OracleDriver ClassNotFoundException
  • JPA или JDBC, как они отличаются?
  • Кодировка символов JDBC
  • Как выполнить файл сценария .sql с использованием JDBC
  • Как получить значение из последней вставленной строки?
  • Java JDBC - Как подключиться к Oracle с помощью tnsnames.ora
  • Выполнение анонимного блока pl / sql и получение набора результатов в java
  • Драйвер JDBC генерирует исключение «ResultSet Closed» на пустой ResultSet
  • Interesting Posts

    Несогласованность в поведении по принципу «один за другим» между разными типами значений

    Как клонировать Win7 от 512b секторов до 4096b секторов

    Есть ли преимущество производительности в том, что мой жесткий диск разбит на разделы?

    Получение boost :: shared_ptr для этого

    Android \ Intent: отправьте электронное письмо с прикрепленным изображением

    ASP.NET MVC Отключить проверку на стороне клиента на уровне поля

    Заявление о выпуске Fallout … можно ли это разрешить?

    JSF 2.0 устанавливает локаль на протяжении всего сеанса из браузера и программно

    Как я могу дублировать загрузчик HBCD XP с моим MBR?

    Есть ли уловка для подключения и использования Windows 8 / 8.1 с Samba 4 (4.1.6)?

    Является ли этот ключ-ориентированный шаблон защиты доступа известной идиомой?

    Ошибка проверки: значение недействительно

    Список файлов в папке с ресурсами и вложенных папках

    Использование маршрутизатора Wi-Fi в качестве моста для увеличения сигнала?

    Появляется Chrome Font Blurry

    Давайте будем гением компьютера.