56

сессионного компонента определяется следующим образом:Когда использовать сессионный компонент Stateful для сессионного компонента без состояния?

Фасоль сессионного состояние объекта состоит из значений его переменных экземпляра. В сеансовом компоненте с состоянием переменные экземпляра представляют состояние уникального сеанса клиентского компонента. Поскольку клиент взаимодействует («переговоры») со своим компонентом, это состояние часто называется диалоговым состоянием.

сессионного компонента определяется следующим образом:

Фасоль сессионный Компонент без не поддерживает диалоговое состояние с клиентом. Когда клиент вызывает методы безфакторного компонента, переменные экземпляра компонента могут содержать состояние, специфичное для этого клиента, но только для продолжительности вызова . Когда этот метод завершен, состояние конкретного клиента не должно сохраняться. Однако клиенты могут изменять состояние переменных экземпляра в объединенных фазах без состояния, и это состояние удерживается до следующего вызова объединенного компонента без состояния. За исключением во время вызова метода все экземпляры компонента без состояния равны , что позволяет контейнеру EJB назначать экземпляр любому клиенту . То есть, состояние сессионного компонента без состояния должно применять по всем клиентам.

Он также отметил преимущество сессионного компонента следующим образом:

Поскольку сессионные компоненты могут поддерживать несколько клиентов, они могут предложение лучше масштабируемость для приложений, требующих большого количества клиентов. Как правило, для приложения требуется меньшее количество сессий без состояния без учета состояния , чем сеансовые компоненты с поддержкой состояния для поддержки того же количества клиентов .

Итак, вопрос, который приходит на ум, заключается в том, когда нужно использовать сессионные бобы с состоянием? К моему наивному пониманию вопроса, следует придерживаться использования сессионного компонента без состояния, насколько только может.

Что было бы кандидатами, в которых следует использовать сессионный компонент с состоянием? Какие-нибудь хорошие примеры?

Session Bean

+0

См. Также http://stackoverflow.com/questions/8887140/jsf-request-scoped-bean-keeps-recreating-new-stateful-session-beans-on-every-req – BalusC

ответ

95

Сначала вы должны понять, как бобы создаются и обрабатываются на сервере.

Для фауны без состояния сервер может поддерживать переменное количество экземпляров в пуле. Каждый раз, когда клиент запрашивает такой компонент без состояния (например, посредством метода), для выполнения этого запроса выбирается случайный экземпляр. Это означает, что если клиент выполняет два последующих запроса, возможно, что два запроса экземпляра компонента без состояния обслуживают запросы. На самом деле между двумя запросами нет диалогового состояния. Также, если клиент исчезает, компонент без состояния не уничтожается и может обслуживать следующий запрос от другого клиента.

С другой стороны, сеанс связи с состоянием тесно связан с клиентом. Каждый экземпляр создается и привязывается к одному клиенту и обслуживает только запросы от этого конкретного клиента. Так получилось, что если вы выполняете два последующих запроса в компоненте с состоянием, ваш запрос будет всегда обслуживаться из одного экземпляра компонента. Это означает, что вы можете поддерживать диалоговое состояние между запросами. В конце жизненного цикла клиент вызывает метод удаления, а компонент уничтожается/готов к сбору мусора.

Когда использовать без гражданства или состояния?

Это в основном зависит от того, хотите ли вы сохранить состояние диалога. Например, если у вас есть метод, который добавляет до чисел и возвращает результат, вы используете компонент без состояния, потому что это одноразовая операция. Если вы вызовете этот метод во второй раз с другими номерами, вас больше не интересует результат предыдущего добавления.

Но если вы хотите, например, подсчитать количество запросов, которые сделал клиент, вы должны использовать компонент с состоянием. В этом сценарии важно знать, как часто клиент запрашивал метод bean раньше, поэтому вам необходимо поддерживать диалоговое состояние в компоненте (например, с переменной). Если вы будете использовать фабулу без состояния, запрос клиента будет каждый раз обслуживаться из другого компонента, что помешает вашим результатам.

+13

"* Если клиенты исчезают, бобы тоже будут уничтожены * ". Фактически, сессионные компоненты с сохранением состояния не уничтожаются автоматически, если метод, украшенный '@ Remove' (' javax.ejb'), явно вызывается (этот метод даже не кодируется. Его можно просто оставить пустым/пустым, учитывая, что оно аннотируется '@ Remove'). Если связанный клиент забыл уничтожить сессионный компонент с состоянием, этот компонент будет храниться на сервере, пока сам контейнер не решит удалить его, используя свою собственную политику. Я ошибаюсь? – Tiny

+3

Конечно, вы правы. Более подробную информацию о жизненном цикле bean можно найти здесь: http://docs.oracle.com/javaee/6/tutorial/doc/giplj.html – tobiasdenzler

27

Я думаю, что наибольший пример использования сессионного компонента является для Корзина, где хранятся все продукты, которые пользователь хочет купить.