Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > что такое SessionBean


Автор: sith 27.10.2010, 17:43
... друзья... вообщем то я довольно опытный программист ... не первый год работаю... раньше так поверхностно сталивался с  EJB ... а тут решил наверстать пробелы в знаниях и занялся версий 3.0 

... никак не укладываеться в моей голове что такое этот Session Bean... чем стэйтфул от лэса отлечаеться... время жизни их.. .допустим в спринге было просто хочу синглтон пожалуйста... бин на сессию (и тут понятно что это веб сессия) пожалуйста... а в егб??? чем эти два вида бинов отличаються... как быть если мне нужен синглтон ( миграцию на версию 3,1 не предлогать :]]]])...  по каким идентификатором контейнер понимает что именно этот бин нужно мне вирнуть... или этот бин нужно в кэш засунуть... я уже перечитал спеку официальную но все равно какого то ощущения что я четко понимаю эти вещи нету...

... плиззз хелп... обьясните

Автор: eros2 28.10.2010, 10:47
Чтайте доки, там всё расписано - http://download.oracle.com/javaee/6/tutorial/doc/gipjg.html
С веб-сессиями сессионные EJB не связаны.
Для связи сессионных EJB с веб-сессиями есть Seam, а в java ee 6 есть CDI.

Синглтона в 3 нет. Если нужен синглтон в 3 - то можно юзать специфичные фичи AS, например @Service у JBoss.

Автор: Vasay 28.10.2010, 10:55
sith

Сессия создается для клиента. Только клиент не всмысле - посетитель сайта, а программа этот бин у апликейшен сервера запрашивающая.

Т.е. запустили Вы Web приложение - для него создался один бин, запустили другое вебприложение - для него другой бин. Запустили SE приложение и обратились к бину на сервере - для него создан 3 бин. 

Автор: eros2 28.10.2010, 10:58
Цитата(sith @ 27.10.2010,  17:43)
по каким идентификатором контейнер понимает что именно этот бин нужно мне вирнуть...

Получить ссылку на бин можно двумя путями, через DI и через JNDI.

Stateful бины инжектить не стоит, так как при каждом инжекте мы имеем ссылку на новый instance.

Пример инжекта stateless-бина:

@EJB
private MyBean myBean;

myBean.myMethod1(...);
myBean.myMethod2(...);


поскольку это stateless-бин - методы 1 и 2 могут быть вызваны для разных instance, какой instance будет под рукой (в пуле) ближе - тот и будет использован.

В случае stateful-бина (ссылку на него следует полчить через jndi lookup) методы будут вызваны для одного и того же инстанса.


Стало понятней?

Автор: sith 28.10.2010, 13:15
понятнее но не все...

... как контейнер понимает что запрос пришел из разных клиентов... допустим с вебом понятно... туда возвращаеться id сессии... а тут как???...

... дальше клиент это что... отдельный джарник... или это только веб приложения... ??? 

... если инжектить нерекомендованно то зачем тогда вообще есть возможность эта для стэйтфул бинов. как то это не очень... наверно что в одном месте инжектим а вот тут не рекомендуеться и мне нужно постоянно делать лукап нужного бина...


... пример... допустим есть приложение под кодовым названием  "ведро-1"... есть бин стэйтфул ... бин хранит некий обьект ведро и есть бизнес метод по заполнению этого ведра. получаеться если различные пользователи этого приложения будут вызывать этот метод они все будут работать с одним ведром и заполнять одно ведро.... если будет запущенно два приложения "ведро-1" то укаждых пользователей будет по своему ведру??? 

... 

Автор: eros2 28.10.2010, 13:42
Цитата
... как контейнер понимает что запрос пришел из разных клиентов... допустим с вебом понятно... туда возвращаеться id сессии... а тут как???...

хранится некий контекст сессии, неважно как это реализуется в протоколе.

Цитата
... дальше клиент это что... отдельный джарник... или это только веб приложения... ??? 

Это может быть клиент внутри сервера приложений, а может быть отдельное приложение на свингах, например.

Цитата
... если инжектить нерекомендованно то зачем тогда вообще есть возможность эта для стэйтфул бинов. как то это не очень... наверно что в одном месте инжектим а вот тут не рекомендуеться и мне нужно постоянно делать лукап нужного бина...

почему постоянно? когда нужен новый инстанс, тогда и лукапим.
ЗЫ: стейтфул бины используются РЕДКО.

Цитата
... пример... допустим есть приложение под кодовым названием  "ведро-1"... есть бин стэйтфул ... бин хранит некий обьект ведро и есть бизнес метод по заполнению этого ведра. получаеться если различные пользователи этого приложения будут вызывать этот метод они все будут работать с одним ведром и заполнять одно ведро.... если будет запущенно два приложения "ведро-1" то укаждых пользователей будет по своему ведру???

Не так. Это никак не зависит от приложения.

Ещё раз повторю - при КАЖДОМ лукапе мы получаем НОВЫЙ ИНСТАНС стейтфул бина.

MyBean b = (MyBean)ctx.lookup("MyBean/remote");
b.putOrder(...);
b.putOrder(...);
b.countOrders();

Т.е. здесь вызов методов произойдёт как будто MyBean - обычный класс. Вот примерно как если бы вместо (MyBean)ctx.lookup("MyBean/remote"); тут был new MyBean();, с той лишь разницей что методы отработают на сервере, а не локально.

А если бы MyBean был стейтлесс - то все вызовы методов были бы направлены на произвольные инстансы из пула.

Автор: sith 28.10.2010, 14:59
так... подожди 

Цитата(eros2 @  28.10.2010,  10:58 Найти цитируемый пост)
Stateful бины инжектить не стоит, так как при каждом инжекте мы имеем ссылку на новый instance.


так при инжекте или лукапе будет создаваться новый инстанс?... если я в классе своем пижу анатацию @EJB ... создасться новый или вызоветься старый...


... конкурентный доступ к стэйтфул бинам - я так понимаю что эти бины могут иметь внутренние поля... контейнер обеспечивает конкурентный доступ или это все ложиться на мои хрупкие плечи???


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

Автор: eros2 28.10.2010, 15:24
Цитата
так при инжекте или лукапе будет создаваться новый инстанс?...

Именно.

Цитата
если я в классе своем пижу анатацию @EJB ... создасться новый или вызоветься старый...

посмотрите тут, например - http://forums.java.net/jive/thread.jspa?threadID=13439

Цитата
... конкурентный доступ к стэйтфул бинам - я так понимаю что эти бины могут иметь внутренние поля... контейнер обеспечивает конкурентный доступ или это все ложиться на мои хрупкие плечи???

конкурентный доступ имеет смысл для синглтона, при работе же со стэйтфул бином работа с ним идёт в том же треде, в котором был лукап, а по каждому лукапу создаётся отдельный инстанс.

Цитата
зачем иметь милион стэйтлесс бинов если они не гарантируют состояние обьекта а значит имеют только сервисные методы... почему не сделать один синглтон... для всех обращений???

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




Может быть вы пытаетесь взвалить на Stateful бины ту задачу что выполняют Entity?

Автор: sith 28.10.2010, 15:40
Цитата(eros2 @  28.10.2010,  15:24 Найти цитируемый пост)
Цитата
так при инжекте или лукапе будет создаваться новый инстанс?...

Именно.


... что именно?... я понимаю инжект это когда я имею переменную в классе и всовываю в нее значение бина по средством анотации @EJB  - при этом будет новый бин или уже до этого созданный???


...

Цитата(eros2 @  28.10.2010,  15:24 Найти цитируемый пост)
Цитата
зачем иметь милион стэйтлесс бинов если они не гарантируют состояние обьекта а значит имеют только сервисные методы... почему не сделать один синглтон... для всех обращений???

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


и все же... к примеру есть инстанс сервиса А у которого есть бизнес метод перевестиНаАнглийский - зачем контейнеру создавать 2,3 милион обьектов... если у этого инстанса нет состояния... и мето вызванный что у одного... что у двух инстансов будет будет выполнять тоже самое... в чем при рост... чем это отличаеться от бычного сервисного синглтона который отдаеться всем кто попросит... в чем приемущества???

Автор: sith 29.10.2010, 16:07
какие нибудь мысли еще???

Автор: stron 29.10.2010, 16:51
Не путайте statefull и stateless
stateless - не обязательно будет создавать новый инстанс, может быть использован уже существующий.
Кол-вом инстансов управляет контейнер.
statefull - даёт гарантию работы с одним и тем же инстансом

Посмотрите EJB 3 in action - сразу тьма вопросов отпадёт

Автор: sith 29.10.2010, 18:46
ну а зачем для стэйтлесс вообще разные инстансы?

Автор: eros2 29.10.2010, 21:01
Цитата(sith @ 29.10.2010,  18:46)
ну а зачем для стэйтлесс вообще разные инстансы?

Ну это же очевидно!
Имеется пул инстансов, так что запрос от клиента отрабатывает на первом свободном инстансе. Это гарантирует, что в момент вызова бизнес-метода только один клиент (тред) использует стейтлесс-бин, т.е. не нужно никакой синхронизации и конкурентности, накладные расходы минимальные. А поскольку все инстансы одинаковые - то они легко масштабируются и запросы могут направляться на любую машину из кластера.

Это вроде как даже само понятно, но можно и книжки почитать, "EJB3 in Action" - то что надо.

Автор: sith 29.10.2010, 22:44
а какие проблемы конкурентности и синхронизации если стэйтлес бин не гарантирует сохранение состояния... если его используют как сервисную заглушку... какие разделяемые ресурсы юзает стэйтлес бин... да и кто зная его спицифику будет всовывать подобные ресурсы в него?

Автор: eros2 29.10.2010, 23:20
Цитата(sith @ 29.10.2010,  22:44)
если его используют как сервисную заглушку

Его используют для реализации бизнес-методов.

Автор: sith 30.10.2010, 09:35
это понятно... но зачем хранить несколько инстансов для бина который не хранит состояние?

Автор: eros2 30.10.2010, 10:23
Уже раза два в этой теме объяснял.

Автор: sith 30.10.2010, 12:04
не очень понятно где эти два раза...

Автор: sith 1.11.2010, 11:48
!!!

Автор: mbasil 1.11.2010, 16:55
Цитата(sith @ 30.10.2010,  09:35)
это понятно... но зачем хранить несколько инстансов для бина который не хранит состояние?

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

Автор: sith 2.11.2010, 13:32
хм... все равно это как то не прозрачно... я как разработчик сервисных класов никогда бы не сохранял промежуточные состояния в таком бине... уж лутше локальные переменные иметь... а транзакции - ну допустим есть один бин для всех всех всех... я вызываю метод а... для него открываеться своя транзакция... если кто то еще вызовет этот метод... для него откроеться его транзакция... был бы это вызова из другого инстанса все равно бы была транзакция... и мы использовали бы все равно одни и теже разделяемые ресурсы

Автор: jk1 2.11.2010, 20:49
sith

Предположим Вы написали такой вот сервисный класс не как бин, а как POJO. И вот Вам нужно обратиться к нему из другой JVM, с машины клиента например. Будете свой протокол сочинять? Поднимать RMI, веб-сервисы? А если это Session Bean, то тут все из коробки: lookup и вызов, две строки кода.

Автор: sith 3.11.2010, 13:03
ну более не мение понятно...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)