JDBC: когда я могу закрыть то, что - PullRequest
2 голосов
/ 31 октября 2008

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

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

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

закрыть соединение

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

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

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

закрыть соединение

Ответы [ 3 ]

7 голосов
/ 01 ноября 2008

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

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

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

3 голосов
/ 31 октября 2008

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

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

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

1 голос
/ 10 ноября 2008

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

ORA-01000: maximum open cursors exceeded

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...