2

Представьте себе сильно используемый объект службы, который реализован как SLSB EJB 2.1, и это также само по себе является потокобезопасным из-за отсутствия состояния вообще. Все его общедоступные методы являются транзакционными (через CMT), наиболее просто требующими транзакции, но некоторые требуют новой транзакции.Масштабируемые последствия преобразования сессионных bean-компонентов без состояния в POJO

Если я преобразую этот SLSB в подлинный однопользовательский POJO (например, используя инфраструктуру DI), как это повлияет на масштабируемость приложения? Когда услуга была SLSB, контейнер EJB управлял пулом экземпляров, из которых каждый клиент получал бы свою собственную копию, поэтому мне интересно, превратит ли его в однопользовательский POJO какой-то конфликт для этого единственного экземпляра.

FWIW, этот номер не является synchronized.

Уточнение: моя мотивация для преобразования SLSB в POJO - это простота как жизненного цикла объекта (true singleton versus container-managed), так и самого кода (один интерфейс и один аннотированный POJO, по сравнению с тремя интерфейсами, один класс компонента , и куча XML в ejb-jar.xml).

Кроме того, FWIW, рассматриваемая услуга является одним из компонентов размещенного веб-приложения, работающего на JBoss 3.x.

+0

Этот ответ: http://stackoverflow.com/questions/134791/why-pool-stateless-session-beans/135840#135840 утверждает, что будет «много раздора и блокировки», но нет подтверждения, цитата , или даже заблаговременное голосование за это заявление, поэтому я не знаю, сколько веса ему дать (без обид для Мваниджи). –

+0

Можете ли вы подробно остановиться на своей среде? Вы все еще используете сервер Java EE? Вы работаете на одной коробке или много? Сколько ядер в коробке? И зачем вам нужен однотонный POJO, в отличие от многих, работающих в разных потоках? –

+0

@ Jim: Я обновил вопрос. Но ваш комментарий, похоже, подразумевает, что singleton не может обслуживать несколько потоков - это действительно так? Это зависит от моего вопроса; как использовать один POJO для сравнения в терминах масштабируемости с использованием объединенного SLSB? Будут ли какие-то потоки ждать, чтобы использовать POJO, пока другие не закончили? –

ответ

3

Если POJO действительно без гражданства или не имеет диалогового состояния (т.е. состояние неизменное), это не ухудшит производительность и может даже немного улучшиться, поскольку вы действительно используете только один экземпляр из вашей инфраструктуры DI, чем пул из контейнера. (Даже пул страдает от конкуренции при высокой нагрузке.)

Синхронизация не требуется для объекта, который является потокобезопасным по дизайну, например, без одного или только неизменяемого состояния. Конкуренций не будет - потоки могут свободно выполнять методы на POJO без синхронизации.

Используя только POJO, вы также можете увидеть действительно то, что происходит в вашем приложении, и можете быть уверены, что скрытая «контейнерная магия» не работает за кулисами.

1

Ваши POJO кажутся идеальными.

Нет, не будет споров, ваша масштабируемость будет идеальной.

  • У вас нет дополнительных затрат.
  • У вас даже меньше, потому что у вас есть один экземпляр вместо нескольких
  • Ваша масштабируемость лучше, потому что вы никогда не достигнете предела своего пула (у вас его нет).
Смежные вопросы