56

Stateful Session-Bean wird wie folgt definiert:Wann sollte Stateful-Session-Bean über Stateless-Session-Bean verwendet werden?

Stateful Session Beans Der Zustand eines Objekts der Werte Variablen seiner Instanz besteht. In einer Stateful-Session-Bean repräsentieren die Instanzvariablen den Status einer eindeutigen Client-Bean-Session. Da der Client mit seiner Bean interagiert ("redet"), wird dieser Status oft als Konversationsstatus bezeichnet.

Stateless Session-Bean wird wie folgt definiert:

Stateless Session Beans Ein Stateless Session Bean halten keinen Gesprächszustand mit dem Kunden. Wenn ein Client die -Methoden eines statuslosen Beans aufruft, enthalten die Instanzvariablen der Bean möglicherweise einen für diesen Client spezifischen Status, jedoch nur für die Dauer des Aufrufs . Wenn die Methode beendet ist, sollte der mandantenspezifische Zustand nicht beibehalten werden. Kunden können jedoch ändern den Zustand der Instanzvariablen in gepoolten staatenlos Bohnen, und dieser Zustand auf den nächsten Aufruf der gepoolten stateless Bean gehalten wird. Außer während Methodenaufrufes alle Instanzen eines zustandslosen bean sind äquivalent, so dass die EJB-Container eine Instanz irgendeines Client zuzuordnen. Das heißt, der Status einer Stateless-Session-Bean sollte über alle Clients hinweg gelten.

Es wird auch den Vorteil, Stateless Session Bean wie folgt erwähnt:

Da stateless Session Beans mehrere Clients unterstützen können, können sie bieten eine bessere Skalierbarkeit für Anwendungen, die eine große Anzahl von Kunden benötigen. In der Regel benötigt eine Anwendung weniger statusfreie Sitzungen Beans als Stateful Session-Beans, um die gleiche Anzahl von Clients zu unterstützen.

Also die Frage, die in den Sinn kommt, wenn man Stateful Session Beans verwenden sollte? Zu meinem naiven Verständnis der Sache sollte man bleiben, Stateless Session Bean zu verwenden, wie er kann.

Was wären die Kandidaten, in denen man Stateful Session Bean verwenden sollte? Irgendwelche guten Beispiele?

Session Bean

+0

In Verbindung stehende: http://stackoverflow.com/questions/8887140/jsf-request-scoped-bean-keeps-recreating-new-stateful-session-beans-on-e-very-req – BalusC

Antwort

95

Zuerst müssen Sie verstehen, wie die Bohnen erstellt und auf dem Server abgewickelt.

Für Stateless Session-Beans kann der Server eine variable Anzahl von Instanzen in einem Pool verwalten. Jedes Mal, wenn ein Client eine solche zustandslose Bean anfordert (z. B. durch eine Methode), wird eine zufällige Instanz ausgewählt, um diese Anfrage zu bedienen. Das bedeutet, wenn der Client zwei nachfolgende Anforderungen ausführt, ist es möglich, dass zwei verschiedene Instanzen des statuslosen Beans die Anforderungen bedienen. Tatsächlich gibt es keinen Gesprächszustand zwischen den beiden Anfragen. Auch wenn der Client verschwindet, wird die statuslose Bean nicht zerstört und kann die nächste Anfrage von einem anderen Client aus ausführen.

Auf der anderen Seite ist eine Stateful Session Bean eng mit dem Client verbunden. Jede Instanz wird erstellt und an einen einzelnen Client gebunden und bedient nur Anfragen von diesem bestimmten Client. Wenn Sie also zwei aufeinanderfolgende Anforderungen für eine Stateful-Bean ausführen, wird Ihre Anforderung immer von derselben Instanz der Bean geliefert. Das bedeutet, dass Sie einen Konversationsstatus zwischen den Anforderungen aufrechterhalten können. Am Ende des Lebenszyklusses ruft der Client eine remove-Methode auf und die Bean wird zerstört/bereit für die Garbage Collection.

Wann statusfrei oder Stateful zu verwenden?

Das hängt hauptsächlich davon ab, ob Sie den Konversationszustand pflegen wollen. Wenn Sie beispielsweise eine Methode verwenden, die zu Zahlen addiert und das Ergebnis zurückgibt, verwenden Sie eine statusfreie Bean, da dies eine einmalige Operation ist. Wenn Sie diese Methode ein zweites Mal mit anderen Nummern aufrufen, sind Sie nicht mehr am Ergebnis der vorherigen Addition interessiert.

Wenn Sie jedoch beispielsweise die Anzahl der Anforderungen eines Clients zählen möchten, müssen Sie eine Stateful Bean verwenden. In diesem Szenario ist es wichtig zu wissen, wie oft der Client die Bean-Methode zuvor angefordert hat. Daher müssen Sie den Konversationsstatus in der Bean beibehalten (z. B. mit einer Variablen). Wenn Sie hier eine statuslose Bean verwenden würden, würde die Anfrage des Clients jedes Mal von einer anderen Bean geliefert werden, was Ihre Ergebnisse verfälscht.

+13

"* Wenn die Clients verschwindet die Bohnen werden auch zerstört * ". Tatsächlich werden statusbehaftete Session-Beans nicht automatisch zerstört, es sei denn, eine mit '@ Remove' (' javax.ejb') dekorierte Methode wird explizit aufgerufen (diese Methode muss nicht einmal codiert werden. Sie könnte einfach leer gelassen werden, da sie leer ist kommentiert mit '@ Remove'). Wenn der zugeordnete Client vergessen hat, eine Stateful-Session-Bean zu zerstören, bleibt diese Bean auf dem Server hängen, bis der Container selbst entscheidet, sie mit einer eigenen Richtlinie zu entfernen. Gehe ich falsch? – Tiny

+3

Natürlich hast du Recht. Weitere Informationen zum Bohnenlebenszyklus finden Sie hier: http://docs.oracle.com/javaee/6/tutorial/doc/giplj.html – tobiasdenzler

27

Ich denke, dass das größte Beispiel einen Stateful Session-Bean verwendet für einen ist Warenkorb, wo Sie alle Produkte speichern, die Benutzer kaufen wollen.