Зачем запускать сеанс бездействия beans?
Stateless beans в Java не сохраняет свое состояние между двумя вызовами от клиента. Поэтому в двух словах мы можем рассматривать их как объекты с бизнес-методами. Каждый метод принимает параметры и возвращает результаты. Когда метод вызывается, в стеке выполнения создаются локальные переменные. Когда метод возвращает locals, удаляются из стека, и если бы были выделены некоторые временные объекты, они все равно собирали мусор.
С моей точки зрения, которая не отличается от метода вызова одного и того же экземпляра отдельными потоками. Итак, почему контейнер не может использовать один экземпляр bean вместо объединения нескольких из них?
Ответы
Ответ 1
Объединение делает несколько вещей.
Один, имея один bean на один экземпляр, вы гарантированно должны быть потокобезопасными (сервлеты, например, не являются потокобезопасными).
Во-вторых, вы уменьшаете потенциальное время запуска, которое может иметь bean. В то время как сеанс Beans является "без гражданства", они должны быть неактивными в отношении клиента. Например, в EJB вы можете ввести несколько ресурсов сервера в сеанс Bean. Это состояние является приватным для bean, но нет причин, по которым вы не можете удержать его от вызова к вызову. Итак, объединив Beans, вы уменьшаете эти поисковые запросы только тогда, когда создается bean.
Три, вы можете использовать пул bean в качестве средства дросселирования трафика. Если у вас всего 10 Beans в пуле, вы будете получать не более 10 запросов, работающих одновременно, остальные будут поставлены в очередь.
Ответ 2
Транзактивность модели Java EE использует контекст потока для управления жизненным циклом транзакции.
Это упрощение существует, поэтому нет необходимости реализовывать какой-либо конкретный интерфейс для непосредственного взаимодействия с объектом UserTransaction; когда транзакция извлекается из InitialContext (или вводится в сеанс bean), она привязана к локальной локальной переменной для повторного использования (например, если метод в вашем сеансе без состояния bean вызывает другой сеанс без состояния bean, который также использует инъецированную транзакцию.)
Ответ 3
Жизненный цикл сеанса безстоящих состояний beans - это не существует, пассивное и MethodReady (пассивное или неактивное) состояние. Чтобы оптимизировать perormance, вместо того, чтобы проходить через bean из состояния готовности в метод, контейнер управляет bean между активным и пассивным состояниями через обратные вызовы контейнера - ejbActivate() и ejbPassivate() там, управляя пулом bean.
sreenut
Ответ 4
Объединение повышает производительность.
Один экземпляр, обрабатывающий все запросы/потоки, приведет к большому количеству конфликтов и блокировок.
Поскольку вы не знаете, какой экземпляр будет использоваться (и несколько потоков могут использовать один экземпляр одновременно), beans должен быть потокобезопасным.
Контейнер может управлять размером пула на основе фактической активности.