Как вернуть объекты в пул по тайм-ауту с помощью пула apache commons

Я использую библиотеку Apache Commons Pool для поддержки пула соединений с диванной базой (можно рассматривать как любое соединение, на самом деле не имеет значения ).

Проблема, с которой я столкнулся, заключается в том, что единственный найденный мной способ вернуть объекты в пул — сделать это программно, вызвав метод returnObjectиз класса GenericObjectPool. . Это заставляет приложение гарантировать возврат объекта после заимствования из пула, независимо от каких-либо исключений или неожиданного поведения в приложении.

Несмотря на то, что я контролирую возврат объектов в пул во всем приложении, я считаю рискованным полагаться исключительно на программиста в вопросе возврата объектов. Кто-нибудь знает способ автоматического возврата объектов после превышения заданного тайм-аута (возврат объектов). Также будет работать любой способ заставить пул создавать новые объекты после превышения времени ожидания для заимствованных объектов.

PS: Мое приложение предоставляет набор веб-служб REST, которые подключаются к распределенному серверу кэширования памяти (Couchbase). Пул создает набор подключений к Couchbase.

Любое предложение поможет!

РЕДАКТИРОВАТЬ

Первое решение, которое я пробовал, состояло в том, чтобы создать новый класс (CouchbaseClientHandler), содержащий объект соединения из типа объектов, хранящихся в пуле ( CouchbaseClient). Я реализовал метод finalizeдля CouchbaseClientHandler, гарантируя, что связанный объект действительно возвращается в пул, если ссылка на этот объект терялась из-за неожиданного исключения. Объект будет возвращен, когда сборщик мусора уничтожит объект. Это не сработало, как ожидалось. Невозможно предсказать, когда сборщик мусора прибудет для восстановления объектов, и обычно это занимало больше времени, чем хотелось бы.

Решение, над которым я сейчас работаю, немного отличается, но намного безопаснее. Поскольку мой пул предназначен для использования веб-службами, и поскольку каждая веб-служба работает в отдельном и уникальном потоке (я использую Джерси на Tomcat), я решил использовать статическую переменную хэш-карты, которая сопоставляет уникальные идентификаторы потоков. в список объектов CouchbaseClient, созданных и заимствованных из пула при выполнении веб-сервиса. Поскольку мои веб-сервисы спроектированы таким образом, что независимо от того, что происходит, метод-обработчик будет обрабатывать окончательный вывод перед возвратом, я могу быть уверен, что всегда запускаю метод, который возвращает в пул. те заимствованные объекты (соединения), которые не были эффективно возвращены в пул.

Хотя это сработало для меня очень хорошо, я действительно хотел бы знать, есть ли лучший способ требовать или стирать по тайм-ауту заимствованные объекты, которые не были возвращены.

5
задан Javierfdr 13 June 2012 в 04:22
поделиться