Gestionnaires de pools d'objets
Les gestionnaires de pools d'objets contrôlent la réutilisation des objets d'application et des objets Developer Kit, tels que Vectors et HashMaps.
Plusieurs gestionnaires de pools d'objets peuvent être créés dans une cellule Application Server. Chaque gestionnaire de pool d'objets comporte un nom JNDI (Java™ Naming and Directory Interface) unique au niveau de la cellule. Les applications peuvent trouver un gestionnaire de pools d'objets donné en effectuant une recherche JNDI à l'aide du nom JNDI spécifique.
l'interface publique ObjectPoolManager { ObjectPool getPool(Class aClass) émet une InstantiationException, IllegalAccessException; ObjectPool createFastPool(Class aClass) émet une InstantiationException, IllegalAccessException; } l'interface publique ObjectPool { Object getObject(); void returnObject(Object o); }
La méthode getObject() supprime l'objet du groupe d'objets. Si un appel getObject() est effectué alors que le groupe est vide, un objet du même type sera créé. Un appel returnObject( ) replace l'objet dans le groupe d'objets. Si aucun appel returnObject() n'est effectué, l'objet ne sera plus attribuable depuis le groupe d'objets. Si l'objet n'est pas renvoyé au groupe d'objets, le processus de récupération de place pourra lui être appliqué.
- l'objet doit être une classe publique avec un constructeur public par défaut.
- S'il implémente l'interface java.util.Collection interface, il doit prendre en charge la méthode clear().
Chaque classe d'objets mis en pool est dotée de son propre pool d'objets. De plus, une application obtient un pool d'objets pour un objet donné en utilisant la méthode ObjectPoolManager.getPool() ou ObjectPoolManager.createFastPool(). A la différence de createFastPool(), getPool() renvoie un pool pouvant être partagé par plusieurs unités d'exécution. La méthode createFastPool(), elle, renvoie un pool utilisable par une seule unité d'exécution.
Si, dans une machine virtuelle Java, la méthode getPool() est appelée plusieurs fois pour une seule classe, le programme renvoie le même pool. Un nouveau pool est renvoyé pour chaque appel lorsque la méthode createFastPool() est appelée. En principe, getPool() renvoie un pool synchronisé par l'unité d'exécution.
A l'évidence, le pool utilisable par plusieurs unités d'exécution est légèrement plus lent qu'un pool rapide en raison de la nécessité de gérer la synchronisation de l'unité d'exécution. Toutefois, l'utilisation du pool rapide doit se faire avec une prudence extrême.
interface publique PoolableObject { void init(); void returned(); }
Si les objets placés dans le pool implémentent cette interface et si la méthode ObjectPool.getObject() est appelée, la méthode init() est appelée sur l'objet distribué par le pool. Lorsque la méthode ObjectPool.returnObject() est appelée, la méthode PoolableObject.returned() est appelée sur l'objet avant son renvoi dans le pool d'objets. Cette méthode permet aux objets d'être pré-initialisés ou nettoyés.
la classe publique PooledArrayList étend ArrayList qui implémente PoolableObject { public PooledArrayList() { } public void init() { } public void returned() { clear(); } }
Si l'application utilise cet objet à la place d'une véritable objet ArrayList, l'objet ArrayList est automatiquement effacé lorsqu'il est renvoyé dans le pool.
Le fait d'effacer un objet ArrayList le signale simplement comme étant vide mais le tableau correspondant n'est pas libéré. C'est pourquoi, tandis que l'application réutilise l'objet ArrayList, le tableau de support se développe jusqu'à ce qu'il soit assez grand pour tous les besoins de l'application. A ce stade, nous arrêtons d'allouer et de copier de nouveaux tableaux de support et réalisons les meilleures performances.
Il se peut qu'il soit impossible ou inopportun d'utiliser le mécanisme ci-dessus. L'alternative consiste à implémenter un pool d'objets personnalisé et à l'enregistrer auprès du gestionnaire de pools d'objets en tant que pool à utiliser pour des classes de ce type. L'administrateur de WebSphere enregistre la classe lorsque le gestionnaire de pools d'objets est défini dans la cellule. Veillez à placer ces classes dans des fichiers Java Archive (JAR) disponibles sur tous les noeuds de la cellule où elles pourraient être utilisées.