jdbc: когда я могу закрыть то, что

#java #database #jdbc

Вопрос:

в настоящее время у меня есть код jdbc со следующей базовой структурой:

получить соединение

(повторите следующие 4 строки несколько раз, никогда не закрывая инструкцию)
получить инструкцию
получить набор результатов
обработать набор результатов
закрыть набор результатов

тесное соединение

После написания этого кода мне пришло в голову, что мне нужно закрыть инструкцию.
1 каковы последствия не закрытия заявления.
2 будет ли работать следующее, это si, закрывающее заявление, помешает мне обработать набор результатов в обычном режиме?

получить соединение

(повторите следующие 5 строк несколько раз)
получить инструкцию
получить набор результатов
закрыть инструкцию
обработать набор результатов
закрыть набор результатов

тесное соединение

Ответ №1:

Поведение закрытия указано в спецификации JDBC. Закрытие соединения освобождает все ресурсы JDBC, связанные с подключением, и неявно закроет все инструкции, наборы результатов и т.д. Закрытие инструкции приведет к закрытию наборов результатов.

Пример 2 не гарантирует, что он будет работать. Оператор должен быть закрыт ПОСЛЕ использования набора результатов. В спецификации говорится, что вы должны получить исключение SQLException, если попытаетесь использовать этот набор результатов (некоторые драйверы JDBC не строго следуют спецификации-и MS не является самым большим нарушителем).

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

Ответ №2:

К сожалению, ответ зависит от вашего драйвера JDBC. То, что вы там написали, может сработать.

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

ПРАВКА: Я понимаю, что у вас был второй вопрос, в котором вы спрашивали о последствиях не закрытия отчетов/наборов результатов и так далее. Эффекты также зависят от вашего драйвера JDBC, но это может привести к значительным утечкам ресурсов.

Ответ №3:

Если вы используете Oracle и забудете закрыть инструкции, вы получите

 ORA-01000: maximum open cursors exceeded
 

через некоторое время.