2010-02-17 3 views
1

Je dois implémenter un pool de sessions renvoyées par un système externe, afin que je puisse les réutiliser rapidement dès que nécessaire (la création d'une session prend du temps). J'ai travaillé avec datasource pour créer un pool de connexions à une base de données (DBCP d'Apache), et c'était une solution implémentée. Qu'est-ce que nous utilisons dans un cas général pour regrouper des objets arbitraires, et y a-t-il des solutions implémentées, c'est-à-dire des objets, pas des interfaces, pour faire face à la tâche douloureusement?Mise en pool d'objets: howto

La deuxième question serait, comment pouvons-nous tester si la session est en vie? Existe-t-il une méthode spécifique que nous remplaçons dans le pool d'objets, qui interroge les propres méthodes de la session?

La troisième question, TRÈS IMPORTANTE, serait, si l'objet de regroupement d'objets était statique? Un ensemble d'objets que j'extrais du système doit être partagé entre différentes applications Web. Donc, disons, nous extrayons 5 sessions. App A interroge le POOL et obtient la première session disponible. Maintenant, il reste 4 sessions. Une autre application B démarre et interroge THE MEME POOL. etc La piscine est partagée. Parmi les différentes instances de la même application Web, s'exécutant sur la même machine.

+1

Si vous êtes déjà familier avec Commons DBCP, cela est basé sur Commons Pool, qui est une bibliothèque de regroupement d'objets à usage général. – skaffman

+0

@skaffman Cela peut être, mais ici, je ne vois que quelques implémentations qui ne font rien http://commons.apache.org/pool/apidocs/org/apache/commons/pool/package-summary.html Cela ne suffit pas pour obtenir ça a marché. Y a-t-il quelque chose de plus spécifique? – EugeneP

+1

Vous devez étendre 'BaseObjectPool', ce qui est assez facile.Vous devez faire un peu de travail ... – skaffman

Répondre

1
  1. Pour un pool générique d'objets, vous avez un Apache Commons project pour cela.
  2. Pour tester qu'une session est en vie, il existe différentes manières, mais beaucoup d'entre elles sont peu fiable. Et le fiable (faire une requête sur dual) est lent. Vous pouvez jeter un oeil à c3p0, qui a cette fonctionnalité intégrée.
  3. Tant que vos nombreuses applications Web sont dans le même fichier WAR, je pense que vous seriez prêt à utiliser cet objet de pool statique. Bien que, personnellement, je préfère les singletons aux objets statiques qui ont autre chose que des méthodes et des constantes d'utilité.

En général, je suis un grand fan de Hibernate ... avez-vous envisagé d'utiliser pour votre application? Vous pouvez toujours faire des requêtes SQL simples à travers elle, et il gère votre pooling et la mise en cache pour vous.

+0

@mlaverd paragraphe 3 - J'ai légèrement modifié ma question pour donner plus d'explications sur ce que "partagé entre les applications" signifie – EugeneP

+0

@EugeneP mis à jour ma réponse en conséquence. – malaverdiere

1

Si vous utilisez un serveur d'applications J2EE, envisagez de créer un composant implémentant l'architecture Java Connector (JCA). Chaque instance du composant accède à une seule session et vous configurez le conteneur pour créer au plus cinq instances (à partir de votre exemple). Le conteneur gère le pool et le cycle de vie du composant. En outre, toutes les applications déployées sur ce serveur d'applications partagent le pool du composant. Si je me souviens bien (cela fait un moment), il y a aussi un moyen de signaler au conteneur qu'une instance est morte. Dans ce scénario, le conteneur supprime l'instance morte et instancie un nouveau.

Certains serveurs d'applications non-J2EE prennent en charge les composants JCA, vérifiez donc même si vous n'utilisez pas un conteneur J2EE traditionnel.

+0

JCA prend en charge la mise en pool, mais est destiné à la connectivité entrante/sortante. OMI, si vous voulez juste la mise en commun, c'est un peu exagéré. – ewernli

+0

La question mentionne la gestion d'un pool de sessions fourni par un système externe et partagé entre des applications indépendantes. Des exigences de ce type surviennent généralement lorsque quelque chose comme la licence limite le nombre de connexions à partir d'une source unique telle qu'une boîte ou un processeur. – Faron

+0

Vous avez en fait très raison. JCA peut alors être approprié. Cela permettrait également de résoudre le problème de Classloader si le pool est partagé pour différentes applications Web. (J'avais voté pour vous répondre de toute façon). – ewernli