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

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

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

4 ответа

Решение

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

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

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

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

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

Набор результатов

Если держать наборы результатов открытыми, некоторые блокировки будут открыты, если вы этого не сделаете commit (который затем закрывает набор результатов), таким образом, в зависимости от вашего приложения, вы можете быстро получить взаимоблокировку или серьезные проблемы с живостью. Независимо от того, удерживаете ли вы соединения открытыми, всегда закрывайте наборы результатов как можно быстрее, чтобы высвободить как можно больше ресурсов в базу данных.

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

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

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

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

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

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

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

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

Другие вопросы по тегам