#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
через некоторое время.