Wann wird Stateful Session Bean über Stateless Session Bean verwendet?


82

Eine Stateful Session Bean ist wie folgt definiert:

Stateful Session Beans Der Status eines Objekts besteht aus den Werten seiner Instanzvariablen. In einer Stateful Session Bean repräsentieren die Instanzvariablen den Status einer eindeutigen Client-Bean-Sitzung. Da der Client mit seiner Bean interagiert („spricht“), wird dieser Status häufig als Konversationsstatus bezeichnet.

Eine zustandslose Sitzungs-Bean ist wie folgt definiert:

Stateless Session Beans Eine Stateless Session Bean verwaltet keinen Konversationsstatus mit dem Client. Wenn ein Client die Methoden einer zustandslosen Bean 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 abgeschlossen ist, sollte der clientspezifische Status nicht beibehalten werden. Clients können jedoch den Status von Instanzvariablen in gepoolten zustandslosen Beans ändern, und dieser Status wird beim nächsten Aufruf der gepoolten zustandslosen Bean beibehalten. Mit Ausnahme des Methodenaufrufs sind alle Instanzen einer zustandslosen Bean gleichwertig, sodass der EJB-Container jedem Client eine Instanz zuweisen kann. Das heißt, der Status einer zustandslosen Session-Bean sollte für alle Clients gelten.

Der Vorteil der Verwendung einer zustandslosen Sitzungs-Bean gegenüber einer zustandsbehafteten Sitzungs-Bean ist folgender:

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

Die Frage, die sich stellt, ist also, wann man Stateful Session Beans verwenden sollte. Nach meinem naiven Verständnis der Sache sollte man sich daran halten, eine zustandslose 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


Antworten:


150

Zuerst müssen Sie verstehen, wie die Beans auf dem Server erstellt und verarbeitet werden.

Bei zustandslosen 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. über eine Methode), wird eine zufällige Instanz ausgewählt, um diese Anforderung zu bedienen. Das heißt, wenn der Client zwei nachfolgende Anforderungen ausführt, können möglicherweise zwei verschiedene Instanzen der zustandslosen Bean die Anforderungen bedienen. Tatsächlich gibt es keinen Konversationsstatus zwischen den beiden Anforderungen. Auch wenn der Client verschwindet, wird die zustandslose Bean nicht zerstört und kann die nächste Anforderung von einem anderen Client bedienen.

Andererseits ist eine Stateful Session Bean eng mit dem Client verbunden. Jede Instanz wird erstellt und an einen einzelnen Client gebunden und bedient nur Anforderungen 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 aus bearbeitet. Das heißt, Sie können einen Konversationsstatus zwischen den Anforderungen beibehalten. Am Ende des Lebenszyklus ruft der Client eine Methode zum Entfernen auf und die Bean wird zerstört / ist bereit für die Speicherbereinigung.

Wann staatenlos oder zustandsbehaftet?

Dies hängt hauptsächlich davon ab, ob Sie den Konversationsstatus beibehalten möchten . Wenn Sie beispielsweise eine Methode haben, die zwei Zahlen addiert und das Ergebnis zurückgibt, verwenden Sie eine zustandslose Bean, da es sich um eine einmalige Operation handelt. Wenn Sie diese Methode ein zweites Mal mit anderen Nummern aufrufen, interessiert Sie das Ergebnis der vorherigen Addition nicht mehr.

Wenn Sie 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 zustandslose Bean verwenden würden, würde die Anfrage des Clients jedes Mal von einer anderen Bean bearbeitet, was Ihre Ergebnisse durcheinander bringt.


15
" Wenn die Clients verschwinden, wird auch die Bohne zerstört ". Tatsächlich werden Stateful Session Beans nicht automatisch zerstört, es sei denn, eine von @Remove( javax.ejb) dekorierte Methode wird explizit aufgerufen (diese Methode muss nicht einmal codiert werden. Sie kann einfach leer / leer gelassen werden, da sie mit Anmerkungen versehen ist @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 beschließt, sie mithilfe seiner eigenen Richtlinie zu entfernen. Gehe ich falsch
Winzig

3
Natürlich hast du recht. Weitere Informationen zum Bean-Lebenszyklus finden Sie hier: docs.oracle.com/javaee/6/tutorial/doc/giplj.html
Tobiasdenzler

48

Ich denke, dass das beste Beispiel für die Verwendung einer Stateful Session Bean ein Einkaufswagen ist , in dem Sie alle Produkte speichern, die der Benutzer kaufen möchte.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.