Подтвердить что ты не робот

Безопасно ли вводить EJB в сервлет как переменную экземпляра?

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

Мой вопрос: безопасно ли вводить EJB с помощью аннотации @EJB в сервлет как переменную экземпляра?

Мой первоначальный инстинкт не был бы в предположении, что тот же экземпляр EJB будет обслуживать несколько запросов одновременно. Казалось бы, это также будет инстинктом ряда других программистов: Не вводить сервлеты

Однако я перешел к неправильному выводу. Очевидно, что что вводится в сервлет, является прокси, под капотом действительно ли контейнер обслуживает каждый запрос другим экземпляром и поддерживает безопасность потоков? Как сказал этот форум: Вставить в сервлеты

Кажется, что существует много противоречивых мнений. КОТОРЫЙ ПРАВИЛЬНО???

4b9b3361

Ответ 1

В вашей ссылке "Не вводить сервлеты" ничего не говорится об ejbs или аннотации @ejb. В нем говорится о небезопасных объектах, таких как PersistenceContext.

В спецификации EJB вы можете получить доступ к ejbs из множества удаленных клиентов, включая сервлеты (спецификация EJB 3.0 (JSR-220) - раздел 3.1). Инъекция ejb с использованием аннотации @EJB - это метод получения интерфейса EJB через инъекцию зависимостей (раздел 3.4.1), который является альтернативой поиску объектов ejb в пространстве имен JNDI. Поэтому нет ничего особенного в @EJB-аннотации относительно полученных EJB.

Итак, на основе EJB 3.0 Spec, это стандартная практика получения ejbs из сервлетов с использованием аннотации @EJB.

Ответ 2

Безопасно вводить EJB в сервлет как переменную экземпляра Servlet, если EJB не имеет статуса. Вы ДОЛЖНЫ НИКОГДА не вводить Stateful Bean в сервлете.

Вы должны внедрить свой EJB-апатрид в том, что он не содержит никакой переменной экземпляра, которая сама содержит значение состояния (например, контекст сохранения). Если вам нужно использовать контекст персистентности, вы должны получить его экземпляр в методах EJB. Вы можете сделать это, имея PersistenceContextFactory в качестве переменной экземпляра EJB, а затем вы получите экземпляр менеджера сущностей из Factory в методе EJB.

PersistenceContextFactory является потокобезопасным, поэтому его можно ввести в переменную экземпляра.

До тех пор, пока вы соблюдаете вышеупомянутые правила, он должен быть потокобезопасным, чтобы ввести Stateless Bean в Servlet

Ответ 3

Это смешанная сумка.

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

Я думаю, что указано в inferreddesign, не верно. Не имеет значения, использует ли сеанс без состояния bean контекст персистентности. Только один вызывающий абонент будет когда-либо обращаться к одному экземпляру bean одновременно, поэтому, хотя контекст сохранения не является потокобезопасным, EJB защищает от множественного доступа к нему. Подумайте об этом, как если бы каждый сеанс bean применял к нему синхронизированное ключевое слово.

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

Ответ 4

Я думаю, что простой ответ заключается в том, что вам не гарантировано, что оно безопасно.

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