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

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

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

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

тесная связь

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

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

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

тесная связь


person shsteimer    schedule 31.10.2008    source источник


Ответы (3)


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

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

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

person Francis Beaudet    schedule 31.10.2008

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

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

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

person James Schek    schedule 31.10.2008

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

ORA-01000: maximum open cursors exceeded

спустя некоторое время.

person asalamon74    schedule 10.11.2008