Потокобезопасность переменных экземпляра EJB

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

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

То же самое относится и к введенным переменным, как в следующем примере:

@Stateless
public class User implements UserHomeLocal, UserHomeRemote
{

    @PersistenceContext(name="J2EE")
    private EntityManager manager;
}

В более общем плане: есть ли случай, когда объединенные в пул bean-компоненты могут совместно использовать переменные экземпляра в результате внедрения зависимостей?


person GionJh    schedule 29.06.2015    source источник


Ответы (1)


Спецификация EJB говорит

Контейнер сериализует вызовы к каждому экземпляру сеансового компонента с состоянием и без состояния. Большинство контейнеров поддерживают множество экземпляров сеансового компонента, выполняющихся одновременно; однако каждый экземпляр видит только сериализованную последовательность вызовов методов. Следовательно, сеансовый компонент с состоянием или без состояния не должен быть закодирован как реентерабельный.

Это означает, что по умолчанию он является потокобезопасным. Никаких дополнительных усилий не требуется. В то же время обратите внимание, что bean-компоненты без состояния должны быть «без состояния».

Для bean-компонента без состояния не рекомендуется иметь изменяемое состояние. Это просто рецепт катастрофы. Если вам нужна переменная, которая будет использоваться всеми экземплярами, она должна быть статической. Спецификация EJB ограничивает использование статических изменяемых переменных (переменная уровня класса, например счетчик отслеживать все запросы ко всем экземплярам). В основном «чтение или запись неконечных статических полей» ограничено.

Таким образом, чтобы объединенные в пул bean-компоненты совместно использовали переменную экземпляра, эта переменная должна быть статической и окончательной. Если вы ищете это по каким-либо причинам реализации, вы можете проверить Singleton bean-компоненты . Как только вы создадите одноэлементный компонент, вы можете внедрить его в свой сеансовый компонент. Но я не уверен, что это стоит боли.

И да, диспетчер сущностей или любые подобные объекты Java EE (например, ссылки на менеджеры сущностей Java Persistence или сеансовые компоненты с отслеживанием состояния) будут общими и гарантированно будут потокобезопасными по умолчанию (в условиях без сохранения состояния)

person ring bearer    schedule 29.06.2015
comment
Я вообще не хочу делиться переменными экземпляра между bean-компонентами, я спрашиваю в этом случае, будет ли каждый bean-компонент иметь другой экземпляр EntityManager или нет. - person GionJh; 29.06.2015
comment
голосующий против, пожалуйста, прокомментируйте -почему? Я постараюсь улучшить свой ответ. - person ring bearer; 29.06.2015
comment
не я, я думаю, вы заслуживаете +1, может быть, даже лучшего ответа. Еще один момент, если вы можете уточнить, где я могу прочитать все эти конкретные детали, такие как менеджер сущностей или любые подобные объекты Java EE (например, ссылки на менеджеры сущностей Java Persistence или сеансовые компоненты с отслеживанием состояния), будут совместно использоваться и гарантированно будут потоко- безопасно по умолчанию (без гражданства). Спасибо! - person GionJh; 29.06.2015