Что использовать, чтобы убедиться, что пул соединений всегда закрывается?

Я понимаю, что использовать финализаторы плохо даже для закрытия соединения (Является ли закрытие соединения лучшей практикой финализации?), поскольку их вызов не гарантируется. Но что, если ваши соединения объединены в пул соединений? В моем случае я использую пул Apache Commons (http://commons.apache.org/proper/commons-pool/) для объединения соединений SFTP. Я не могу использовать метод попытки с ресурсами, потому что каждое соединение не должно закрываться в конце каждой попытки (чтобы оно потенциально могло быть повторно использовано пулом для следующего действия).

Я предоставляю метод closePool(), который вызывает pool.close(), чтобы любой программист, использующий мой код, мог вызвать его, но что, если он/она забудет это сделать? Является ли вызов этого метода из финализатора лучшим решением, чтобы попытаться закрыть пул соединений, если это не делается вручную, или есть лучший способ? Будет ли хук выключения работать лучше для этого?


person Creature    schedule 10.03.2014    source источник


Ответы (1)


Если вы пишете библиотеку, которая предоставляет эту функциональность кому-то еще, я действительно не вижу, что еще вы можете сделать, кроме предоставления метода closePool(). Возможно, вы могли бы наследовать свои классы от java.io.Closeable. и/или AutoCloseable, кроме рекламы необходимость очистки ваших ресурсов, вам в основном приходится полагаться на разработчиков, использующих ваш код, чтобы они поступали правильно.

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

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

person matt b    schedule 10.03.2014