|
|
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
rabiterТе, что управляются контейнером специфицированным JSR-299. Там написано что технология должна помочь подружить JSF и EJB. Иногда обзывается Web Bean. Но CDI-bean это вообще любой проинжекченый бин, в том числе @EJB. Осталось понять что вы с Niky4000 подразумеваетет под Application Client. Где и stateful удобен и CDI работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 14:48:26 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
grasoff.net, а как тогда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 14:55:35 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrabiterТе, что управляются контейнером специфицированным JSR-299. Там написано что технология должна помочь подружить JSF и EJB. Иногда обзывается Web Bean. Но CDI-bean это вообще любой проинжекченый бин, в том числе @EJB. Осталось понять что вы с Niky4000 подразумеваетет под Application Client. Где и stateful удобен и CDI работает. Понять-то думаю не сложно. Application client я так понял это desktop имеется ввиду? Толстый клиент? По поводу JSF и CDI - в JSF сейчас рекомендуют использовать CDI вместо JSF Managed Beans например: javax.enterprise.context.SessionScoped вместо javax.faces.bean.SessionScoped. Это да. Но не одним JSF ограничено применение CDI. Вот вы например, работаете со спрингом, и конечно же, используете все радости его IoC? В том числе и длительность жизни бинов (session, request, singleton, prototype, какие там еще есть...). А что нам делать если мы спринг не используем? IoC-то тоже охота. Так вот CDI это в какой-то мере тоже самое, только специфицировано в JavaEE. Имплементация от JBoss Weld. Вещь хорошая, мне понравилась очень как разобрался. Включает в себя например Annotated Qualifiers - т.е. с помощью аннотации мы можем контейнеру указать какую конкретную из имплементаций требуется заинжектить. Продюссеры - методы, которые позволяют написать свой код, решающий какой инстанс будет заинжекчен. И еще много другого. Отлично работает с web. Но и не только, с desktop тоже. И еще, EJB и CDI путать не стоит, тот же класс синглетон есть и в EJB и в CDI: javax.ejb.Singleton - EJB3.1 javax.inject.Singleton - CDI Первый управляется контейнером EJB, второй - CDI. И аннотация @Inject относится к CDI бинам, а @EJB - соответственно к EJB. Так с помощью @Inject заинжектить EJB бин нельзя (хотя это легко обойти с помощью продюссеров). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 15:09:33 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Понять-то думаю не сложно. Application client я так понял это desktop имеется ввиду? Толстый клиент? Ну, да. Продюссеры - методы, которые позволяют написать свой код, решающий какой инстанс будет заинжекчен. И еще много другого. Отлично работает с web. Но и не только, с desktop тоже. То есть какой экземпляр @Singleton'а отдать в пользование в какую сессию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 15:37:12 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
rabiterрекомендуют использовать CDI вместо JSF Managed Beans И еще, EJB и CDI путать не стоит Т.е. CDI-бины это обычные POJO, жизненым циклом которых контейнер умеет управлять, но ни к EJB, ни к Managed Bean они вообще никак не относятся? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 15:44:29 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Blazkowiczrabiterрекомендуют использовать CDI вместо JSF Managed Beans И еще, EJB и CDI путать не стоит Т.е. CDI-бины это обычные POJO, жизненым циклом которых контейнер умеет управлять, но ни к EJB, ни к Managed Bean они вообще никак не относятся? Ну да. Они могут заменить JSF Managed бины. С помощью аннотации @Named CDI бину можно указать строковое имя, через которое потом к нему можно в файслетах обращаться. Единственная проблема - в JSF есть ViewScoped, в CDI такого нет. Но это обходится с помощью ConversationScoped. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 16:22:21 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Я тут размышляю над всем этим... Пока CDI не рассматриваю. Ну, допустим мы будем использовать Stateless, так как существует их Pool и они могут более эффективно обрабатывать web-запросы, чем Singleton'ы. А как быть, например, с фабрикой фабрик - такая штука, которая позволяет легко переключаться с одного набора Session Bean'ов на другой, например, в целях отладки. Она какого типа должна быть при условии, что она возвращает Stateless Session Bean'ы? Тоже Stateless? Или неважно какого типа? А если она будет Singleton, то и то что она возвращает тоже, наверное, будет фактически Singleton? Поясню сказанное на примере, а то вдруг не понятно. Пример: Session Bean, который возвращается фабрикой фабрик является Stateless, а сама фабрика фабрик у нас Singleton, то получается, что фабрика фабрик будет возвращать один и тот же экземпляр Session Bean'а, несмотря что есть их пул. По сути она будет возвращать Singleton. Или нет? Если это так, то поможет ли объявление фабрики фабрик в качестве Stateless? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 16:22:50 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
rabiterНу да. Они могут заменить JSF Managed бины. С помощью аннотации @Named CDI бину можно указать строковое имя, через которое потом к нему можно в файслетах обращаться. Единственная проблема - в JSF есть ViewScoped, в CDI такого нет. Но это обходится с помощью ConversationScoped. Мда. Как JEE ни стремиться к простоте, простота для неё не достижима. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 16:25:05 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Niky4000Понять-то думаю не сложно. Application client я так понял это desktop имеется ввиду? Толстый клиент? Ну, да. Продюссеры - методы, которые позволяют написать свой код, решающий какой инстанс будет заинжекчен. И еще много другого. Отлично работает с web. Но и не только, с desktop тоже. То есть какой экземпляр @Singleton'а отдать в пользование в какую сессию? Не только синглетона, это может быть sessionscoped и requestscoped бин. Фишка в том, что с помощью продюссера вы можете реализовать какую-нибудь логику, которая принимает решение какой экземпляр бина должен быть заинжекчен. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ну и далее в коде получаем доступ к IntegrationService: Код: java 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 16:30:39 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrabiterНу да. Они могут заменить JSF Managed бины. С помощью аннотации @Named CDI бину можно указать строковое имя, через которое потом к нему можно в файслетах обращаться. Единственная проблема - в JSF есть ViewScoped, в CDI такого нет. Но это обходится с помощью ConversationScoped. Мда. Как JEE ни стремиться к простоте, простота для неё не достижима. Аминь, сплю и вижу спринг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 16:31:19 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
То есть какой экземпляр @Singleton'а отдать в пользование в какую сессию? Опечатался. У Singleton'а 1 экземпляр. Я тут имел ввиду экземпляр Stateless - их же много типа и они в пуле находятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 16:37:58 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
А всё-таки как быть с фабрикой фабрик? И ещё, если мы создаём EntityManagerFactory и EntityManager'ы в Singleton'е, то тот клиент, который первый захватил ресурс и будет им пользоваться, а другие будут ждать. То есть соединение с СУБД тоже как бы Singleton получается, если можно так выразиться. А если пул соединений захочется сделать, то надо List<EntityManagerFactory> и List<EntityManager> делать? И как-то определять какой em занят, а какой нет? То есть пулом ручками рулить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 16:51:29 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Я полагаю сервер не даст инжектить EntityManager в Singleton. А для нормального конкуретного доступа достаточно заинжектить EntityManagerFactory и для каждого потока получать EntityManager в локальную переменную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 16:55:07 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Niky4000А всё-таки как быть с фабрикой фабрик? И ещё, если мы создаём EntityManagerFactory и EntityManager'ы в Singleton'е, то тот клиент, который первый захватил ресурс и будет им пользоваться, а другие будут ждать. То есть соединение с СУБД тоже как бы Singleton получается, если можно так выразиться. А если пул соединений захочется сделать, то надо List<EntityManagerFactory> и List<EntityManager> делать? И как-то определять какой em занят, а какой нет? То есть пулом ручками рулить? Пул соединений к базе реализовывать не надо. Все уже реализовано до нас. Возьмите с Apache Commons, или готовый реализованный в ApplicationServer'е. Потокобезопасностью синглетона можно управлять, в частности, с помощью аннотации LockType. Если поместите синглетон в критическую секцию, то он будет потокобезопасным, но может стать и бутылочным горлышком. Где будут ждать куча клиентов своей очереди выполнить код синглетона для своего потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 16:59:05 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Я полагаю сервер не даст инжектить EntityManager в Singleton. А для нормального конкуретного доступа достаточно заинжектить EntityManagerFactory и для каждого потока получать EntityManager в локальную переменную. Да не, он даёт. Вот я и думаю над доступом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 17:03:19 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Niky4000Да не, он даёт. Вот я и думаю над доступом... Ну и в чем проблема? инжектим EntityManagerFactory через CDI, в методах делаем em = factory.getEntityManager() и в finally блоке закрываем. try-with-resources, интересно, поддерживается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 17:09:38 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
авторЯ полагаю сервер не даст инжектить EntityManager в Singleton. А для нормального конкуретного доступа достаточно заинжектить EntityManagerFactory и для каждого потока получать EntityManager в локальную переменную. Когда мы создаём EntityManagerFactory - то это и есть установка соединения с СУБД. В момент создания мы передаём такие параметры, как user, password, url... Под пулом соединений я понимаю List<EntityManagerFactory>. Ну, если ручками. авторПотокобезопасностью синглетона можно управлять, в частности, с помощью аннотации LockType. А у нас ничего плохого не происходит если 2 потока борются за 1 EntityManager. Просто 1 пользуется, а другой ждёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 17:11:37 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Ну и в чем проблема? инжектим EntityManagerFactory через CDI, в методах делаем em = factory.getEntityManager() и в finally блоке закрываем. try-with-resources, интересно, поддерживается? А может быть создать некое количество соединений в Singleton'е и выдавать свободные? И соединения не закрывать, так как открытие/закрытие соединений - процесс ресурсоёмкий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 17:14:33 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Niky4000Когда мы создаём EntityManagerFactory - то это и есть установка соединения с СУБД. Нет, это не есть "установка соединения с СУБД". Niky4000 В момент создания мы передаём такие параметры, как user, password, url... Это у вас в DataSource должно быть прописано. Niky4000Под пулом соединений я понимаю List<EntityManagerFactory>. Зачем? авторА у нас ничего плохого не происходит если 2 потока борются за 1 EntityManager. Просто 1 пользуется, а другой ждёт. Ну, т.е. выстроить всех клиентов в очередь, это по-вашему, нормально? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 17:15:56 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Niky4000А может быть создать некое количество соединений в Singleton'е и выдавать свободные? И соединения не закрывать, так как открытие/закрытие соединений - процесс ресурсоёмкий. Чего вы к соединениям пристали? Ими пусть DataSource занимается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 17:16:44 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Нет, это не есть "установка соединения с СУБД". А что это такое? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 17:31:12 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Niky4000А что это такое? Это ужас. :) Создаётся EMF с неким внутреним пулом. Так никто не делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 17:33:00 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
properties.put("eclipselink.jdbc.connections.initial", "1"); properties.put("eclipselink.jdbc.connections.min", "1"); properties.put("eclipselink.jdbc.connections.max", "4"); А чего тут плохого? Вот определяю размеры пула. И рулю им ручками. Можно конечно использовать Conteiner Management EntityManager - там пулом рулит контейнер, а его размеры опредяляются настройками сервера. Но там тип ресурса JTA, а с JTA нельзя в явном виде управлять транзакциями. Вот я и создаю свой EMF - определяю динамически пул, и сам управляю транзакциями и соединениями. Это ужас. :) Создаётся EMF с неким внутреним пулом. Так никто не делает. А как делают? В данном случае я могу явно определить к какому СУБД подключаться. Мне нужно в явном виде управлять транзакциями Entity Manager'а. Когда что commit'ить или rollback'ить, так как Conteiner Management EntityManager сам как-то там решает когда ему commit'ить или rollback'ить и часто это неудобно, так как ожидая увидеть данные в таблице, оказывается что там их нет - неза'commit'чены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2012, 21:40:28 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Соединение создаётся не при создании EMF, а при создании EM. Причём как ни верти-крути: создание нескольких экземпляров EMF или EM от разных EMF - всё равно клиенты выстраиваются в очередь. А физически соединение, видимо, одно получается и все через него ходят на запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2012, 10:07:39 |
|
||
|
@Stateless Session Bean работает как @Singleton почему-то...
|
|||
|---|---|---|---|
|
#18+
Нужно создать нормальный JNDI DataSource в сервере и его использовать из приложения. Это в будущем вам сэкономит массу времени при командной разработке и деплойменте на разные сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2012, 11:31:33 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37859086&tid=2131451]: |
0ms |
get settings: |
14ms |
get forum list: |
27ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
74ms |
get topic data: |
24ms |
get forum data: |
4ms |
get page messages: |
93ms |
get tp. blocked users: |
3ms |
| others: | 286ms |
| total: | 541ms |

| 0 / 0 |
