wake-up-neo.com

Wann wird Stateful Session Bean anstelle von Stateless Session Bean verwendet?

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 Session-Bean ist wie folgt definiert:

Zustandslose Session-Beans Eine zustandslose Session-Bean unterhält keinen Konversationsstatus mit dem Client. Wenn ein Client die Methoden eines zustandslosen Beans aufruft, enthalten die Instanzvariablen des Beans möglicherweise einen für diesen Client spezifischen Status, jedoch nur für die Dauer des Aufrufs. Nach Abschluss der Methode sollte der mandantenabhängige Status nicht beibehalten werden. Clients können jedoch den Status von Instanzvariablen in Pool-Stateless-Beans ändern. Dieser Status wird beim nächsten Aufruf der Pool-Stateless-Bean beibehalten. Mit Ausnahme des Methodenaufrufs sind alle Instanzen einer statusfreien Bean äquivalent, sodass der EJB-Container jedem Client eine Instanz zuweisen kann. Das heißt, der Status einer statuslosen Sitzungs-Bean sollte für alle Clients gelten.

Der Vorteil der Verwendung einer statuslosen Sitzungs-Bean gegenüber einer statusbehafteten Sitzungs-Bean ist folgender:

Da zustandslose Sitzungs-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 statusfreie Sitzungs-Beans als statusbehaftete Sitzungs-Beans, um die gleiche Anzahl von Clients zu unterstützen.

Die Frage, die sich stellt, ist, wann man Stateful Session Beans verwenden sollte. Nach meinem naiven Verständnis der Materie sollte man eine zustandslose Session-Bean verwenden, wie er kann.

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

Session Bean

77
sheidaei

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

Für zustandslose Sitzungs-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 ein Verfahren), wird eine zufällige Instanz ausgewählt, um diese Anforderung zu bedienen. Das heißt, wenn der Client zwei aufeinanderfolgende Anforderungen ausführt, ist es möglich, dass 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 ein stateful session bean eng mit dem Client verbunden. Jede Instanz wird erstellt und an einen einzelnen Client gebunden und verarbeitet 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 bedient. Das heißt, Sie können einen Konversationsstatus zwischen den Anforderungen beibehalten. Am Ende des Lebenszyklus ruft der Client eine Entfernungsmethode auf und die Bean wird zerstört/ist bereit für die Garbage Collection.

Wann sollte man staatenlos oder stateful verwenden?

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 Zahlen aufrufen, interessiert Sie das Ergebnis der vorherigen Addition nicht mehr.

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 bereits angefordert hat, sodass Sie den Konversationsstatus in der Bean beibehalten müssen (z. B. mit einer Variablen). Wenn Sie hier eine zustandslose Bean verwenden, wird die Anforderung des Clients jedes Mal von einer anderen Bean aus bedient, was Ihre Ergebnisse verfälscht.

138
tobiasdenzler

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

42
BSeitkazin