Коли використовувати бін сеансу Stateful над сеансом Stateless?


83

Бін сеансу із увімкненням визначається наступним чином:

Сеанси, що містять статус, стан об’єкта складається із значень змінних його екземпляра. У компоненті сеансу, що містить статус, змінні екземпляра представляють стан унікального сеансу клієнт-бін. Оскільки клієнт взаємодіє (“розмовляє”) зі своїм компонентом, цей стан часто називають станом розмови.

Бін сеансу без стану визначається таким чином:

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

Перевага використання компонента сеансу без збереження стану перед компонентом сеансу із зазначенням стану полягає в наступному:

Оскільки сеансові компоненти без стану можуть підтримувати декілька клієнтів, вони можуть запропонувати кращу масштабованість для програм, які потребують великої кількості клієнтів. Як правило, програма вимагає меншої кількості сеансів без збереження стану, ніж компонентів сеансів з підтримкою стану, щоб підтримувати однакову кількість клієнтів.

Отже, питання, яке спадає на думку, полягає в тому, коли слід використовувати боб-сеанси з висловом? На моє наївне розуміння цього питання, слід дотримуватися сесійного бобу без громадянства, наскільки він може.

Якими б були кандидати, в яких слід використовувати боб для сесійного стану? Хороші приклади?

Сеанс Бін


Відповіді:


151

По-перше, ви повинні зрозуміти, як компоненти створюються та обробляються на сервері.

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

З іншого боку, компонент сеансу, що містить стан, тісно пов’язаний з клієнтом. Кожен екземпляр створюється і обмежується одним клієнтом і обслуговує лише запити від цього конкретного клієнта. Так трапляється, що якщо ви зробите два наступних запити на компонент із статусом, ваш запит буде завжди подаватися з одного і того ж екземпляра компонента. Це означає, що ви можете підтримувати стан розмов між запитами. В кінці життєвого циклу клієнт викликає метод видалення, і компонент знищується / готовий до збору сміття.

Коли використовувати апатрид чи державний?

Це головним чином залежить від того, чи хочете ви підтримувати розмовний стан . Наприклад, якщо у вас є метод, який додає два числа і повертає результат, ви використовуєте компонент без стану, оскільки це одноразова операція. Якщо ви викликаєте цей метод вдруге з іншими номерами, результат попереднього додавання вас більше не цікавить.

Але якщо ви хочете, наприклад, підрахувати кількість запитів, зроблених клієнтом, вам доведеться використати боб із статусом. У цьому сценарії важливо знати, як часто клієнт раніше запитував метод bean, тому вам доведеться підтримувати розмовний стан у bean (наприклад, із змінною). Якщо ви використовуєте тут компонент без громадянства, запит клієнта буде подаватися щоразу з іншого компонента, що псує ваші результати.


16
Msgstr " Якщо клієнти зникають, квасоля теж знищується ". Насправді, компоненти сеансу, що містять статус, не руйнуються автоматично, якщо тільки метод, прикрашений @Remove( javax.ejb), не викликається явно (цей метод навіть не потрібно кодувати. Його можна просто залишити порожнім / порожнім, враховуючи те, що він анотований @Remove). Якщо асоційований клієнт забув знищити сеансовий компонент із встановленим станом, цей компонент буде продовжувати звисати на сервері, поки сам контейнер не вирішить видалити його, використовуючи власну політику. Я помиляюся?
Крихітний

3
Звичайно, ти маєш рацію. Більше інформації про життєвий цикл бобів можна знайти тут: docs.oracle.com/javaee/6/tutorial/doc/giplj.html
tobiasdenzler

48

Я думаю, що найкращим прикладом використання компонента Stateful session bean є кошик для покупок , де ви зберігаєте всі товари, які користувач хоче придбати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.