Должен ли AutoCloseable Iterator для вызова ResultSet закрываться от финализатора?

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

1 ответ

Такая очистка обычно не выполняется в Java finalize() метод. Неспособность обеспечить правильное удаление ресурса является ошибкой программирования; Попытка очистить после плохого программирования позволяет продолжить плохие практики.

Более распространенным является вариант отладки, чтобы помочь разработчикам, которые признали, что у них есть проблемы. Обычно это не включено по умолчанию из-за накладных расходов, но когда включен правильный флаг, при выделении ресурса создается трассировка стека. Если finalize() вызывается без уничтожения ресурса, стек записывается, чтобы показать местоположение утечки.

Есть несколько предостережений вокруг finalize()и вы должны вообще избегать этого. Одна из главных проблем в этом случае состоит в том, что нет гарантии, что он когда-либо будет вызван, и даже если это так, он может не успеть помочь.

Другие вопросы по тегам