56

stateful è definito come segue:Quando utilizzare il bean di sessione con stato sul bean di sessione stateless?

bean di sessione stateful Lo stato di un oggetto è costituito dai valori delle sue variabili istanza. In un bean di sessione stateful, le istanze rappresentano lo stato di una sessione univoco del client. Poiché il client interagisce ("parla") con il bean, questo stato è spesso chiamato lo stato della conversazione.

Stateless session bean è definito come segue:

Fagioli Stateless Session session bean stateless non mantiene uno stato di conversazione con il cliente. Quando un client richiama i metodi di un bean senza stato, le variabili di istanza del bean possono contenere uno stato specifico per quel client, ma solo per la durata della chiamata . Al termine del metodo, lo stato specifico del client non deve essere mantenuto. I client possono, tuttavia, modificare lo stato delle variabili di istanza in pool di bean senza stato e questo stato viene mantenuto fino alla successiva chiamata del bean senza stato in pool. Tranne durante l'invocazione del metodo, tutte le istanze di un bean stateless sono equivalenti a , consentendo al contenitore EJB di assegnare un'istanza a qualsiasi client . Cioè, lo stato di un bean di sessione stateless dovrebbe applicarsi a in tutti i client.

è anche menzionato il vantaggio di session bean stateless come segue:

Perché bean di sessione senza stato in grado di supportare più clienti, che possono un'offerta migliore scalabilità per applicazioni che richiedono un gran numero di clienti. In genere, un'applicazione richiede un numero minore di session bean stateless rispetto ai bean di sessione stateful per supportare lo stesso numero di client .

Quindi la domanda che viene in mente è quando si dovrebbe usare bean di sessione con stato? Per la mia ingenua comprensione della questione, si dovrebbe usare il bean di sessione senza stato che può.

Quali sarebbero i candidati in cui si dovrebbe usare il bean di sessione stateful? Qualche buon esempio?

Session Bean

+0

Correlati: http://stackoverflow.com/questions/8887140/jsf-request-scoped-bean-keeps-recreating-new-stateful-session-beans-on-every-req – BalusC

risposta

95

Prima di tutto bisogna capire come i fagioli vengono create e gestite sul server.

Per i bean di sessione stateless il server può mantenere una quantità variabile di istanze in un pool. Ogni volta che un client richiede tale bean senza stato (ad esempio attraverso un metodo) viene scelta un'istanza casuale per servire quella richiesta. Ciò significa che se il client fa due richieste successive è possibile che due diverse istanze del bean senza stato servano le richieste. Infatti non esiste uno stato di conversazione tra le due richieste. Inoltre, se il client scompare, il bean senza stato non viene distrutto e può servire la successiva richiesta da un altro client.

D'altra parte un bean di sessione con stato è strettamente connesso al client. Ogni istanza viene creata e limitata a un singolo client e serve solo richieste da quel particolare client. Così succede che se fai due richieste successive su un bean stateful, la tua richiesta verrà sempre fornita dalla stessa istanza del bean. Ciò significa che puoi mantenere uno stato di conversazione tra le richieste. Alla fine del ciclo di vita il client chiama un metodo di rimozione e il bean viene distrutto/pronto per la garbage collection.

Quando utilizzare stateless o stateful?

Questo dipende soprattutto se si desidera mantenere la stato della conversazione. Ad esempio se si dispone di un metodo che somma fino a numeri e restituisce il risultato si utilizza un bean senza stato perché è un'operazione una tantum. Se chiami questo metodo una seconda volta con altri numeri, non sei più interessato al risultato dell'aggiunta precedente.

Ma se si desidera ad esempio contare il numero di richieste effettuate da un client, è necessario utilizzare un bean con stato. In questo scenario è importante sapere con quale frequenza il client ha richiesto il metodo bean prima, quindi è necessario mantenere lo stato di conversazione nel bean (ad esempio con una variabile). Se si usasse un bean senza stato, la richiesta del client verrebbe notificata ogni volta da un bean diverso che compromette i risultati.

+13

"* Se i client scompaiono, anche il bean viene distrutto * ". In realtà, i bean di sessione stateful non vengono distrutti automaticamente a meno che un metodo decorato da '@ Remove' (' javax.ejb') sia invocato esplicitamente (quel metodo non deve nemmeno essere codificato. Potrebbe semplicemente essere lasciato vuoto/vuoto dato che è annotato da '@ Remove'). Se il client associato ha dimenticato di distruggere un bean di sessione stateful, quel bean verrebbe tenuto in sospeso sul server fino a quando il contenitore stesso non deciderà di rimuoverlo utilizzando la propria policy. Sto sbagliando? – Tiny

+3

Certo che hai ragione. Ulteriori informazioni sul ciclo di vita dei bean possono essere trovate qui: http://docs.oracle.com/javaee/6/tutorial/doc/giplj.html – tobiasdenzler

27

Penso che il più grande esempio di utilizzo di un fagiolo sessione di Stateful è per un Carrello, in cui si memorizzano tutti i prodotti che l'utente vuole comprare.

Problemi correlati