Сторонняя библиотека для пула объектов со сроком действия в Java

Я нахожусь на сервере веб-сервиса, и у меня есть объекты с внутренним соединением.
Инициализация этого соединения занимает очень много времени, поэтому моя идея состояла в том, чтобы использовать пул объектов для повторного использования соединений между различными запросами.

Объекты связаны с каждым пользователем, поэтому я предпочитаю использовать имя пользователя в качестве ключа и соединение в качестве значения. Но я не хочу, чтобы соединение было открыто навсегда. Возможно, через какое-то время его следует уничтожить, если пользователь больше не запускает запросы.

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

ehcache предлагает мне уведомления о вытеснении и истечении срока действия, но не срабатывают по истечении тайм-аута, только если кешированный объект был снова затронут.

Кто-нибудь знает библиотеку, которая может сделать эту работу за меня?


person Sorontur    schedule 16.07.2013    source источник
comment
code.google.com/p/guava-libraries/wiki/CachesExplained (см. временное выселение)   -  person assylias    schedule 16.07.2013
comment
да, совсем забыл кеши гуавы: / можешь написать это как ответ? Я думаю, это именно то, что я искал.   -  person Sorontur    schedule 16.07.2013


Ответы (3)


Взгляните на http://commons.apache.org/proper/commons-pool/api-1.6/org/apache/commons/pool/impl/GenericObjectPool.html

Из javadoc:

Optionally, one may configure the pool to examine and possibly evict objects
as they sit idle in the pool and to ensure that a minimum number of idle
objects are available. This is performed by an "idle object eviction" thread,
which runs asynchronously. Caution should be used when configuring this
optional feature. Eviction runs contend with client threads for access to
objects in the pool, so if they run too frequently performance issues may
result.

.... 

minEvictableIdleTimeMillis specifies the minimum amount of time that 
an object may sit idle in the pool before it is eligible for eviction
due to idle time. When non-positive, no object will be dropped from 
the pool due to idle time alone. This setting has no effect unless
timeBetweenEvictionRunsMillis > 0. The default setting for this 
parameter is 30 minutes.

Реализуйте PoolableObjectFactory, который создает ваши соединения, а также реализуйте метод PoolableObjectFactory.destroyObject(T object), чтобы закрыть ваше соединение. Этот метод будет вызываться GenericObejctPool при удалении объектов.

person René Link    schedule 16.07.2013
comment
ах, вот как они хотели это сделать, спасибо! я думаю, что способ гуавы лучше использовать - person Sorontur; 16.07.2013
comment
@Sorontur С концептуальной точки зрения кеш не является пулом объектов. Я также думаю, что кеш — это то, что соответствует вашим требованиям, потому что ваши соединения привязаны к конкретному пользователю, а пул содержит объекты, которые обычно могут использоваться всеми. Конечно, вы можете создать пул для каждого пользователя, но я думаю, это не то, что вам нужно. Поэтому я и думаю, что кеш гуавы прав. +1 за публикацию примера гуавы. - person René Link; 17.07.2013
comment
Я полностью согласен с вами, мое требование представляет собой смесь того и другого. спасибо гугл ребятам! они всегда знают чего мы хотим ;) - person Sorontur; 17.07.2013

Вдохновленный идеей assylia, я использовал способ гуавы здесь, мое решение

final RemovalListener<Integer, Connection> removalListener = new RemovalListener<Integer, Connection>() {
    @Override
    public void onRemoval(final RemovalNotification<Integer, Connection> notification) {
        disconnect(notification.getValue());
    }
};

Cache<Integer, Connection> cache = CacheBuilder.newBuilder().maximumSize(20)
        .expireAfterAccess(30, TimeUnit.SECONDS)
        .removalListener(removalListener).build();
final ScheduledExecutorService cacheMaintanance = Executors.newSingleThreadScheduledExecutor();
cacheMaintanance.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        cache.cleanUp();
    }
}, 10, 10, TimeUnit.SECONDS);
person Sorontur    schedule 16.07.2013

Недавно к этому был добавлен новый универсальный интерфейс:

http://commons.apache.org/proper/commons-pool/

person user1016765    schedule 08.07.2014