Почему я должен называть экземпляр close() в экземпляре ResultSet и Connection?

Когда мне больше не нужно использовать экземпляры этих ResultSet и Connection в моей программе, почему я должен вызвать метод .close() для обоих из них?

В чем опасность (если таковая имеется) не делать этого?

Ответ 1

Здесь есть два вопроса:

Соединения с базой данных

Удержание открытия базы данных открывает ресурсы ресурсов в базе данных; он использует память, а базы данных настроены на максимальное количество соединений, поэтому вы увеличиваете вероятность истечения соединений. Также поддерживается состояние сеанса, поэтому вы можете столкнуться с проблемами, когда случайно заблокированные блокировки находятся за пределами их предполагаемого объема.

С положительной стороны подготовленные заявления остаются компилируемыми и готовыми к использованию, поэтому, если вы правильно кодируете и используете свой SQL, вы можете получить значительные преимущества в производительности за счет повторного использования подготовленных операторов. Тем не менее, это может усложнить ваш код и заботиться о нем.

Кроме того, получение соединения довольно дорогое, поэтому существуют

Ответ 2

*.close() позволяет экземпляру объекта выпускать ссылки на ресурсы, которые он может удерживать.

В случае ResultSet это может быть довольно значительное количество других объектов. GC в конце концов уйдет, чтобы очистить их - если вы "отпустите" ResultSet. Это хорошая практика, чтобы войти.

Объект A Connection будет содержать ресурсы, связанные с соединением. В этом случае GC никогда не сможет напрямую восстановить эти ресурсы (возможно, косвенно, если Connection реализует метод finalize). Вы хотите *.close() что-либо, что может задерживать ресурсы любого ограниченного характера, поэтому этот ресурс можно повторно использовать.

Это не редкость, например, для некоторых соединений. У вас будет лучший ответ и меньше возможностей для отказа, если вы выпустите эти ресурсы, как только сможете.

В случаях BOTH закрытие может улучшить общую отзывчивость вашего кода; это хорошая ставка, чтобы сделать.

Ответ 3

Не закрывая соединения JDBC, вы увеличиваете вероятность длительных ожиданий при подключении незанятых JDBC-подключений, когда используется объединение пулов. Закрытие соединений JDBC позволит быстрее использовать и повысить производительность.

Невозможность закрыть набор результатов, может привести к тому, что некоторые базы данных не освободят ресурсы курсора.

Ответ 4

Если вы не закрыли объект набора результатов, вы можете столкнуться с ошибкой памяти при длительном выполнении кода. Я столкнулся с ошибкой памяти, когда я пропустил ее закрытие, и прямо сделал ссылку на результат как null. Я использовал базу данных MySQL.