web-dev-qa-db-fra.com

Quand utiliser le bean de session Stateful sur le bean de session Stateless?

Un bean de session avec état est défini comme suit:

Stateful Session Beans L'état d'un objet est constitué des valeurs de ses variables d'instance. Dans un bean de session avec état, les variables d'instance représentent l'état d'une session unique de bean client. Étant donné que le client interagit ("dialogue") avec son haricot, cet état est souvent appelé état conversationnel.

Un bean session sans état est défini comme suit:

Beans Session sans état Un bean session sans état ne maintient pas un état de conversation avec le client. Lorsqu'un client appelle les méthodes d'un bean sans état, les variables d'instance du bean peuvent contenir un état spécifique à ce client, mais uniquement pour la durée de l'appel. Lorsque la méthode est terminée, l'état spécifique au client ne doit pas être conservé. Les clients peuvent toutefois modifier l'état des variables d'instance dans les beans sans état mis en pool, et cet état est conservé jusqu'à la prochaine invocation du bean mis à jour et en pool. Sauf pendant l'appel de la méthode, toutes les instances d'un bean sans état sont équivalentes, ce qui permet au conteneur EJB d'attribuer une instance à n'importe quel client. Autrement dit, l'état d'un bean de session sans état doit s'appliquer à tous les clients.

L'avantage d'utiliser un bean de session sans état sur un bean de session avec état est le suivant:

Etant donné que les beans session sans état peuvent prendre en charge plusieurs clients, ils peuvent offrir une meilleure évolutivité pour les applications nécessitant un grand nombre de clients. En règle générale, une application nécessite moins de beans de session sans état que de beans de session avec état pour prendre en charge le même nombre de clients.

La question qui me vient à l’esprit est de savoir quand utiliser des beans de session avec état? Pour ma compréhension naïve de la question, on devrait s'en tenir à utiliser un haricot de session sans état comme il peut.

Quels seraient les candidats dans lesquels on devrait utiliser le bean session avec état? Des bons exemples?

Session Bean

77
sheidaei

Vous devez d’abord comprendre comment les beans sont créés et gérés sur le serveur.

Pour beans session stateless, le serveur peut gérer un nombre variable d'instances dans un pool. Chaque fois qu'un client demande un tel bean sans état (par exemple, via un procédé), une instance aléatoire est choisie pour répondre à cette demande. Cela signifie que si le client effectue deux demandes ultérieures, il est possible que deux instances différentes du bean sans état servent les demandes. En fait, il n'y a pas d'état conversationnel entre les deux requêtes. De plus, si le client disparaît, le bean sans état n'est pas détruit et peut servir la demande suivante d'un autre client.

D'autre part, un bean session avec état est étroitement connecté au client. Chaque instance est créée et liée à un client unique et ne traite que les demandes de ce client particulier. Il se trouve que si vous faites deux demandes ultérieures sur un bean avec état, votre demande sera toujours servie à partir de la même instance du bean. Cela signifie que vous pouvez conserver un état de conversation entre les demandes. À la fin du cycle de vie, le client appelle une méthode de suppression et le bean est en cours de destruction/prêt pour la récupération de place.

Quand utiliser apatride ou avec état?

Cela dépend principalement du fait que vous souhaitiez conserver le état conversationnel. Par exemple, si vous avez une méthode qui additionne deux nombres et renvoie le résultat, vous utilisez un bean sans état, car il s'agit d'une opération unique. Si vous appelez cette méthode une seconde fois avec d'autres numéros, vous n'êtes plus intéressé par le résultat de l'addition précédente.

Mais si vous voulez, par exemple, compter le nombre de demandes d’un client, vous devez utiliser un bean avec état. Dans ce scénario, il est important de savoir à quelle fréquence le client a déjà demandé la méthode du bean. Vous devez donc conserver l'état conversationnel dans le bean (par exemple, avec une variable). Si vous utilisiez un bean sans état ici, la demande du client serait servie à partir d'un bean différent, ce qui gâcherait vos résultats.

138
tobiasdenzler

Je pense que le plus grand exemple d'utilisation d'un Bean Stateful Session est pour un Panier, où vous stockez tous les produits que l’utilisateur souhaite acheter.

42
BSeitkazin