2009-12-17 3 views
2

J'ai cherché à implémenter la mise en pool dans une partie de mon application. Je veux utiliser la bibliothèque Commons Pool, mais je suis un peu préoccupé par le fonctionnement du comportement close(). En regardant les javadocs et le code source, il ne semble pas clair si les objets créés dans le pool seront détruits lorsque la méthode close() est appelée. D'après ce que je peux voir, seuls les objets inactifs dans la piscine seront détruits - tous ceux qui sont utilisés, et qui doivent encore être retournés, ne seront pas touchés.Qu'est-ce qu'Apache Commons Pool close() comportement

Ai-je manqué quelque chose ici? Je veux être sûr que tous les objets sont détruits correctement lorsque le pool est fermé.

Quelqu'un l'a déjà utilisé et a une idée de comment cela fonctionne?

+0

à laquelle vous voulez vous référer? – skaffman

Répondre

1

En règle générale (quelle que soit la bibliothèque de regroupement), il n'est pas prudent de détruire un objet en cours d'utilisation. Cela entraînera très probablement une exception. Si vous voulez garantir une fermeture propre, vous devez vous assurer que tous les objets ont été renvoyés dans le pool.

Y a-t-il une raison pour laquelle vous faites une fermeture avant que tous les objets aient été retournés dans le pool?

+1

Au moment où mon application est arrêtée (probablement par un sysadmin), des objets groupés peuvent être utilisés. Cependant, afin de libérer les ressources allouées à ces objets, je vais quand même devoir les fermer avant de quitter l'application. Idéalement, un appel à close() sur le pool fonctionnerait comme ceci: 1) Empêcher l'emprunt de nouveaux objets 2) Fermer les objets inactifs dans le pool 3) Fermer les objets empruntés lorsqu'ils sont retournés dans le pool, blocage jusqu'à tous les objets ont été retournés Cela ne semble pas être une exigence inhabituelle. – DrewEaster

+1

Poignées Apache (1) et (2). Pour résoudre le problème (3), envisagez de sous-classer la classe de regroupement et de gérer vous-même close(). Je suppose que l'effacement/vidange du pool n'est pas dans l'implémentation Apache, car il est difficile de gérer le cas général en raison de problèmes de threading et de timeout. – jdigital

+0

@drewzilla: (3a) Apache Commons Pool désarme les objets empruntés au retour si le pool était fermé, c'est dans le [javadoc maintenant] (http://commons.apache.org/pool/apidocs/org/apache/commons/ pool/impl/GenericKeyedObjectPool.html # close% 28% 29). (3b) http://stackoverflow.com/questions/13355752/how-to-shutdown-a-generickeyedobjectpool-safely – palacsint

0

Comme indiqué dans javadoc pour la méthode close dans Commons Pool 2, lorsque cette méthode est appelée, les instances inactives sont détruites, mais les instances extraites vers les clients ne sont pas affectées. Après close, borrowObject échouera avec IllegalStateException, mais returnObject réussira, avec l'instance de retour détruite au retour. Donc, si vous pouvez compter sur vos clients pour renvoyer des objets une fois que vous avez fermé le pool, les instances seront nettoyées. Si vous voulez bloquer jusqu'à ce que cela soit fait, regardez numActive. close désinscrit également le pool de jmx, utilisez donc getNumActive directement dans ce cas.