Un bean de sesión con estado se define de la siguiente manera:
Beans de sesión con estado El estado de un objeto consta de los valores de sus variables de instancia. En un bean de sesión con estado, las variables de instancia representan el estado de una sesión cliente-bean única. Debido a que el cliente interactúa ("habla") con su bean, este estado a menudo se denomina estado conversacional.
Un bean de sesión sin estado se define de la siguiente manera:
Beans de sesión sin estado Un bean de sesión sin estado no mantiene un estado conversacional con el cliente. Cuando un cliente invoca los métodos de un bean sin estado, las variables de instancia del bean pueden contener un estado específico para ese cliente, pero solo durante la invocación. Cuando finaliza el método, no se debe conservar el estado específico del cliente. Sin embargo, los clientes pueden cambiar el estado de las variables de instancia en beans sin estado agrupados, y este estado se mantiene hasta la siguiente invocación del bean sin estado agrupado. Excepto durante la invocación del método, todas las instancias de un bean sin estado son equivalentes, lo que permite que el contenedor EJB asigne una instancia a cualquier cliente. Es decir, el estado de un bean de sesión sin estado debe aplicarse en todos los clientes.
La ventaja de utilizar un bean de sesión sin estado sobre un bean de sesión con estado es la siguiente:
Dado que los beans de sesión sin estado pueden admitir varios clientes, pueden ofrecer una mejor escalabilidad para aplicaciones que requieren una gran cantidad de clientes. Normalmente, una aplicación requiere menos beans de sesión sin estado que beans de sesión con estado para admitir el mismo número de clientes.
Entonces, la pregunta que me viene a la mente es ¿cuándo se deben usar beans de sesión con estado? Según mi ingenua comprensión del asunto, uno debería limitarse a utilizar un bean de sesión sin estado como sea posible.
¿Cuáles serían los candidatos en los que se debería usar un bean de sesión con estado? ¿Algún buen ejemplo?
Respuestas:
Primero debe comprender cómo se crean y manejan los beans en el servidor.
Para los beans de sesión sin estado, el servidor puede mantener una cantidad variable de instancias en un grupo. Cada vez que un cliente solicita un bean sin estado (por ejemplo, a través de un método) se elige una instancia aleatoria para atender esa solicitud. Eso significa que si el cliente realiza dos solicitudes posteriores, es posible que dos instancias diferentes del bean sin estado sirvan las solicitudes. De hecho, no existe un estado conversacional entre las dos solicitudes. Además, si el cliente desaparece, el bean sin estado no se destruye y puede atender la siguiente solicitud de otro cliente.
Por otro lado, un bean de sesión con estado está estrechamente conectado al cliente. Cada instancia se crea y se limita a un solo cliente y solo atiende solicitudes de ese cliente en particular. Entonces sucede que si realiza dos solicitudes posteriores en un bean con estado, su solicitud se atenderá siempre desde la misma instancia del bean. Eso significa que puede mantener un estado de conversación entre las solicitudes. Al final del ciclo de vida, el cliente llama a un método de eliminación y el bean se destruye / está listo para la recolección de basura.
Eso depende principalmente de si desea mantener el estado conversacional . Por ejemplo, si tiene un método que suma dos números y devuelve el resultado, usa un bean sin estado porque es una operación de una sola vez. Si llama a este método por segunda vez con otros números, ya no estará interesado en el resultado de la suma anterior.
Pero si desea, por ejemplo, contar el número de solicitudes que ha realizado un cliente, debe usar un bean con estado. En este escenario, es importante saber con qué frecuencia el cliente ha solicitado el método bean antes, por lo que debe mantener el estado conversacional en el bean (por ejemplo, con una variable). Si usara un bean sin estado aquí, la solicitud del cliente se serviría cada vez desde un bean diferente, lo que estropea sus resultados.
fuente
@Remove
(javax.ejb
) sea invocado explícitamente (ese método ni siquiera necesita ser codificado. Simplemente podría dejarse vacío / en blanco dado que está anotado por@Remove
). Si el cliente asociado olvidó destruir un bean de sesión con estado, ese bean se mantendría colgando en el servidor hasta que el contenedor decida eliminarlo usando su propia política. ¿Me estoy equivocando?Creo que el mejor ejemplo de uso de un bean de sesión con estado es para un carrito de compras , donde almacena todos los productos que el usuario desea comprar.
fuente