Подтвердить что ты не робот

Закрывает ли соединение автоматически закрытие оператора и набора результатов?

Я знаю, что безопасный шаблон в Java заключается в том, чтобы закрыть ResultSet, Statement и Connection по порядку в блоке finally.

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

Мне было интересно, закрывает ли соединение автоматически все объекты-утверждения, созданные из этого соединения?

Обновление:
Я использую DatabaseProductVersion: Oracle Database 11g Release 11.1.0.0.0
DriverName: драйвер JDBC от Oracle

DriverVersion: 10.2.0.4.0

4b9b3361

Ответ 1

Да, это так, API Connection.close говорит: "Немедленно освобождает эту базу данных объектов подключения и ресурсы JDBC вместо того, чтобы ждать их автоматического выхода". Проблема в том, что приложения обычно используют пулы соединений с базами данных, и они могут просто вернуть Connection to pool в Connection.close.

В любом случае, хорошая практика всегда закрывать ResultSet и Statement явно и не полагаться на Connection.close.

Кроме того, это не лучшая идея напрямую работать с JDBC. Вы можете использовать Spring JDBC и забыть о проблеме с ресурсами.

Ответ 2

Подробности в конечном счете сводятся к каждой реализации драйвера JDBC; однако, как только соединение с базой данных будет закрыто, все, что с ним связано, расположено на стороне БД, поэтому клиентская сторона ничего не может сделать, кроме как автоматически закрыть объекты, представляющие эти ресурсы.

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