Должен ли AutoCloseable Iterator для вызова ResultSet закрываться от финализатора?
У меня есть итератор, поддерживаемый ResultSet. Мне это нужно для постобработки на уровне строк. Итератор реализует интерфейс AutoCloseable. Соединение остается открытым до тех пор, пока мы не переберем все строки / итерации, прерванные пользователем. И все хорошо, если потребитель итератора явно вызывает метод close() или использует итератор в блоке Java7 try. Однако, если потребитель не делает этого, я не могу гарантировать, что соединение будет возвращено в пул. В мире C# мы выполняем финализатор и вызываем Dispose(bool) из финализатора в качестве запасного варианта. Должны ли мы сделать то же самое в Java?
1 ответ
Такая очистка обычно не выполняется в Java finalize()
метод. Неспособность обеспечить правильное удаление ресурса является ошибкой программирования; Попытка очистить после плохого программирования позволяет продолжить плохие практики.
Более распространенным является вариант отладки, чтобы помочь разработчикам, которые признали, что у них есть проблемы. Обычно это не включено по умолчанию из-за накладных расходов, но когда включен правильный флаг, при выделении ресурса создается трассировка стека. Если finalize()
вызывается без уничтожения ресурса, стек записывается, чтобы показать местоположение утечки.
Есть несколько предостережений вокруг finalize()
и вы должны вообще избегать этого. Одна из главных проблем в этом случае состоит в том, что нет гарантии, что он когда-либо будет вызван, и даже если это так, он может не успеть помочь.