Как часто соединение, заявление и 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 = ?" 

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

  • Почему autoReconnect = true не работает?
  • Обработка одновременного запроса при сохранении в базе данных oracleа?
  • Заполнение jTable с использованием данных базы данных
  • Вам нужна транзакция базы данных для чтения данных?
  • java.util.stream с ResultSet
  • Java ResultSet, как проверить, есть ли какие-либо результаты
  • КлассNotFoundException com.mysql.jdbc.Driver
  • java.sql.SQLException Индекс параметров вне диапазона (1> количество параметров, которое равно 0)
  • Именованные параметры в JDBC
  • Как имитировать БД для тестирования (Java)?
  • ПодготовленоСодержание с Statement.RETURN_GENERATED_KEYS
  • Interesting Posts

    События Qt и сигнальные / слоты

    java.lang.NoClassDefFoundError: сбой разрешения: Landroid / support / v4 / os / BuildCompat

    C ++ конвертировать шестнадцатеричную строку в целое число со знаком

    laravel 5.5 Срок действия страницы истек из-за неактивности. Обновите и повторите попытку.

    Какая связь может быть перехвачена сетью, к которой я подключен через VPN?

    Аутентификация веб-API ASP.NET MVC 4 с помощью поставщика членства

    C ++ Можно ли определить, указывает ли указатель на действительный объект?

    Как использовать Bluetooth в эмуляторе Android?

    Закрытие программы JOptionPane

    Получить твиты публичного твиттера

    Вам нужно избавляться от объектов и устанавливать их в null?

    Android 6.0 Marshmallow. Не удается записать на SD-карту

    Диалоговое окно BitLocker: отключить флажок «Показывать символы пароля, когда я их набираю»

    Когда использовать extern в C ++

    Обработка пробелов во имя набора данных ZFS в сценарии оболочки

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