Как вернуть объекты в пул по таймауту с использованием пула Apache Commons
Я использую библиотеку Apache Commons Pool для поддержки пула соединений couchbase (может рассматриваться как любой вид соединения, на самом деле не имеет значения).
Проблема, с которой я сталкиваюсь, заключается в том, что единственный способ вернуть объекты в пул - это сделать это программно, вызвав метод returnObject из класса GenericObjectPool. Это вынуждает приложение гарантировать возврат объекта после заимствования из пула независимо от каких-либо исключений или непредвиденного поведения в приложении.
Несмотря на то, что я контролирую возврат объектов в пул во всем приложении, я считаю рискованным зависеть исключительно от программиста, который возвращает объекты. Кто-нибудь знает способ автоматического возврата объектов при превышении заданного времени ожидания (восстановление объектов). Это также будет работать любым способом, чтобы пул создавал новые объекты, если превышен тайм-аут для заимствованных объектов.
PS: Мое приложение предоставляет набор веб-служб REST, которые подключаются к распределенному серверу memcache (Couchbase). Пул создает набор соединений с Couchbase.
Любое предложение поможет!
РЕДАКТИРОВАТЬ
Первым решением, которое я попробовал, было создание нового класса (CouchbaseClientHandler), содержащего объект подключения из типа объектов, хранящихся в пуле (CouchbaseClient). Я реализовал метод finalize в CouchbaseClientHandler, гарантируя, что связанное было фактически возвращено в пул, если ссылка на этот объект терялась из-за непредвиденного исключения. Объект будет возвращен, когда сборщик мусора уничтожит объект. Это не сработало, как ожидалось. Невозможно предсказать, когда сборщик мусора прибудет на утилизацию объектов, и это обычно занимало больше времени, чем хотелось бы.
Решение, над которым я сейчас работаю, немного другое, но в целом безопаснее. Поскольку мой пул предназначен для использования веб-службами, а каждый веб-сервис работает в отдельном и уникальном потоке (я использую Jersey на Tomcat), я решил использовать статическую переменную hashmap, которая отображает уникальный идентификатор потока в список объектов CouchbaseClient, созданных заимствованными из пула при выполнении веб-службы. Поскольку мои веб-службы спроектированы таким образом, что, независимо от того, что произойдет, метод-обработчик будет обрабатывать окончательный результат перед возвратом, я могу быть уверен, что всегда буду запускать метод, который возвращает в пул те заимствованные объекты (соединения), что не были эффективно возвращены в бассейн.
Хотя это хорошо сработало для меня, мне бы очень хотелось узнать, есть ли лучший способ получить или уничтожить объекты, которые не были возвращены по тайм-ауту.
1 ответ
Предполагая, что подход уничтожения / создания нового в порядке, и вы используете пул общих ресурсов версии 2.0+, вы можете использовать отслеживание и удаление заброшенных объектов, чтобы убедиться, что емкость не пропадает постоянно, когда объекты заимствованы и никогда не возвращаются. См. Javadoc для AbandonedConfig для параметров конфигурации и конструктор GenericObjectPool, который принимает экземпляр AbandonedConfig в качестве аргумента. При включенном отслеживании и удалении оставленных объектов пул будет уничтожать экземпляры, которые были заимствованы, но не возвращены дольше, чем removeAbandonedTimeout, когда у пула мало места.
Если по какой-либо причине вам необходимо использовать пул версии 1.x, вы можете получить исходный код или напрямую использовать AbandonedObjectPool, который поставляется с DBCP 1.x.