многопоточный сервлет; однопоточный ejb - PullRequest
0 голосов
/ 21 декабря 2010

В традиционном n-уровневом веб-приложении с сервлетами для веб-слоя и ejbs (2.0) для уровня biz, в чем смысл сделать модель сервлета многопоточной, а модель ejb однопоточной?
т.е. для всех запросов существует только 1 экземпляр сервлета, но для ejbs для каждого запроса назначается новый экземпляр компонента из пула компонентов.

Ответы [ 2 ]

2 голосов
/ 28 декабря 2010

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

Однако существует несколько экземпляров Stateless session beans (SLSB), и они объединяются.

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

Это состояние имеет вид ссылок на другие ресурсы . JPA entity manager, который не потокобезопасен, является ярким примером здесь. Во время одного вызова stateless session bean вызывающий должен иметь эксклюзивный доступ к этому ресурсу. Когда звонок возвращается, следующий абонент может иметь эксклюзивный доступ и т. Д.

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

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

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

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

0 голосов
/ 21 декабря 2010

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

Если вы используете только bean-компоненты без состояния, я думаю, что нет причин иметь более одного экземпляра.Но у полнофункциональных EJB-компонентов есть состояние, и поэтому вам необходим экземпляр для одновременного запроса.

Надеюсь, я не сказал чушь собачью.

...