Apache Commons Pool

commons-logo

Je vais vous présenter la librairie Apache Commons Pool qui est utilisée pour la création de nouvelles implémentations de pool.

Il existe déjà des librairies pour gérer un pool de connexions à une base de données mais il peut s'avérer utile d'en créer pour d'autres besoins. Dans ce cas l'utilisation d'Apache Commons Pool simplifie grandement les choses.

Ce projet est disponible en dépendance Maven :
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.2</version>
</dependency>

La classe de base PoolableObjectFactory permet de créer et de gérer des objets dans un pool.

public interface PooledObjectFactory<T> {
PooledObject<T> makeObject();
void activateObject(PooledObject<T> obj);
void passivateObject(PooledObject<T> obj);
boolean validateObject(PooledObject<T> obj);
void destroyObject(PooledObject<T> obj);
}

  1. makeObject() est appelé lors de la création d'objets dans le pool.
  2. activateObject(PooledObject<T> obj) est appelée sur chaque instance étant désactivée avant d'être utilisée
  3. passivateObject(PooledObject<T> obj) est appelée sur chaque instance devant être retournée au pool
  4. validateObject(PooledObject<T> obj) peut être appelée pour être sur qu'un objet est valide avant d'être utilisée.
  5. destroyObject(PooledObject<T> obj) est appelée sur chaque instance qui est supprimée du pool.

La manière la plus simple d'implémenter PoolableObjectFactory est de créer une classe qui étends BasePooledObjectFactory.

Cette factory fournit une méthode makeObject() qui retourne wrap(create()) où  wrap et create sont deux méthodes abstraites que l'on devra implémenter.

La méthode create() permet de créer un objet qui sera géré par le pool, et la méthode wrap() permet de retourner l'objet créé dans le pool.

Par exemple pour créer un pool de connexion :
@Override
public EnterpriseSession create() throws Exception {
return new EnterpriseSession();
}

@Override
public PooledObject<EnterpriseSession> wrap(EnterpriseSession enterpriseSession) {
return new DefaultPooledObject<EnterpriseSession>(enterpriseSession);
}

Par la suite on instancie la création de notre pool de cette manière par exemple :

ObjectPool<EnterpriseSession> pool = new GenericObjectPool<EnterpriseSession>(new EnterpriseSessionFactory());
On peux maintenant récupérer des objets du pool et les libérer.
// Récupération d'une session dans le pool
EnterpriseSession enterpriseSession = pool.borrowObject();

// Libération d'une session dans le pool
pool.returnObject(enterpriseSession);

Il est également possible de redéfinir les paramètres par défaut du pool comme le nombre d'instances maximum, la durée avant qu'une instance soit considérée comme inactive, le temps maximum d'attente pour obtenir une instance du pool...

GenericObjectPoolConfig config = new GenericObjectPoolConfig();
config.setMaxTotal(4); // Nombre d'instance max
config.setMaxWaitMillis(300000); // Temps d'attente max pour obtenir un objet du pool
config.setMinEvictableIdleTimeMillis(60000); // Temps min avant qu'un objet soit considére comme inactif
ObjectPool<EnterpriseSession> pool = new GenericObjectPool<EnterpriseSession>(new EnterpriseSessionFactory(), config);

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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.