Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 | ||
Получить ссылку на бин можно двумя путями, через 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 | ||||||||
хранится некий контекст сессии, неважно как это реализуется в протоколе.
Это может быть клиент внутри сервера приложений, а может быть отдельное приложение на свингах, например.
почему постоянно? когда нужен новый инстанс, тогда и лукапим. ЗЫ: стейтфул бины используются РЕДКО.
Не так. Это никак не зависит от приложения. Ещё раз повторю - при КАЖДОМ лукапе мы получаем НОВЫЙ ИНСТАНС стейтфул бина. MyBean b = (MyBean)ctx.lookup("MyBean/remote"); b.putOrder(...); b.putOrder(...); b.countOrders(); Т.е. здесь вызов методов произойдёт как будто MyBean - обычный класс. Вот примерно как если бы вместо (MyBean)ctx.lookup("MyBean/remote"); тут был new MyBean();, с той лишь разницей что методы отработают на сервере, а не локально. А если бы MyBean был стейтлесс - то все вызовы методов были бы направлены на произвольные инстансы из пула. |
Автор: eros2 28.10.2010, 15:24 | ||||||||
Именно.
посмотрите тут, например - http://forums.java.net/jive/thread.jspa?threadID=13439
конкурентный доступ имеет смысл для синглтона, при работе же со стэйтфул бином работа с ним идёт в том же треде, в котором был лукап, а по каждому лукапу создаётся отдельный инстанс.
Потому что стэйтлесс бины работают очень быстро и легко масштабируются и кластеризуются. Состояние же следует хранить в БД, например. Может быть вы пытаетесь взвалить на Stateful бины ту задачу что выполняют Entity? |
Автор: sith 28.10.2010, 15:40 | ||||
... что именно?... я понимаю инжект это когда я имею переменную в классе и всовываю в нее значение бина по средством анотации @EJB - при этом будет новый бин или уже до этого созданный??? ...
и все же... к примеру есть инстанс сервиса А у которого есть бизнес метод перевестиНаАнглийский - зачем контейнеру создавать 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 | ||
Ну это же очевидно! Имеется пул инстансов, так что запрос от клиента отрабатывает на первом свободном инстансе. Это гарантирует, что в момент вызова бизнес-метода только один клиент (тред) использует стейтлесс-бин, т.е. не нужно никакой синхронизации и конкурентности, накладные расходы минимальные. А поскольку все инстансы одинаковые - то они легко масштабируются и запросы могут направляться на любую машину из кластера. Это вроде как даже само понятно, но можно и книжки почитать, "EJB3 in Action" - то что надо. |
Автор: sith 29.10.2010, 22:44 |
а какие проблемы конкурентности и синхронизации если стэйтлес бин не гарантирует сохранение состояния... если его используют как сервисную заглушку... какие разделяемые ресурсы юзает стэйтлес бин... да и кто зная его спицифику будет всовывать подобные ресурсы в него? |
Автор: eros2 29.10.2010, 23:20 | ||
Его используют для реализации бизнес-методов. |
Автор: 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 2.11.2010, 13:32 |
хм... все равно это как то не прозрачно... я как разработчик сервисных класов никогда бы не сохранял промежуточные состояния в таком бине... уж лутше локальные переменные иметь... а транзакции - ну допустим есть один бин для всех всех всех... я вызываю метод а... для него открываеться своя транзакция... если кто то еще вызовет этот метод... для него откроеться его транзакция... был бы это вызова из другого инстанса все равно бы была транзакция... и мы использовали бы все равно одни и теже разделяемые ресурсы |
Автор: jk1 2.11.2010, 20:49 |
sith, Предположим Вы написали такой вот сервисный класс не как бин, а как POJO. И вот Вам нужно обратиться к нему из другой JVM, с машины клиента например. Будете свой протокол сочинять? Поднимать RMI, веб-сервисы? А если это Session Bean, то тут все из коробки: lookup и вызов, две строки кода. |
Автор: sith 3.11.2010, 13:03 |
ну более не мение понятно... |