Тот факт, что EJB-потокобезопасен, не означает, что различные вызовы методов будут давать согласованные результаты.
EJB дает вам уверенность, что каждый метод в вашем конкретном экземпляре EJB будет выполняться ровно одним потоком . Это не спасет вас от доступа нескольких пользователей к различным экземплярам вашего EJB и опасности противоречивых результатов.
Ваш CountManager
кажется обычным Java-классом, что означает, что вы держите состояние в EJB без сохранения состояния. Это нехорошо, и EJB-потокобезопасность в таком случае не защитит вас от чего-либо. Ваш объект может быть доступен через несколько экземпляров EJB одновременно.
Между первым вызовом метода вашего клиента StatelessEJB.incrementCount()
(который запускает транзакцию - по умолчанию TransactionAttribute
) и вторым вызовом метода клиента StatelessEJB.getCount()
(который запускает новая транзакция) может произойти много вещей, и значение count
может быть изменено.
Если бы вы изменили его на EJB, я не думаю, что вы были бы в большей безопасности. Если это SLSB, то он по-прежнему не может иметь никакого состояния. Если состояние не реализовано как переменная поля EJB, а извлекается из базы данных, то это определенно лучше, но все же - транзакция не является для вас реальной помощью, потому что ваш клиент WebService по-прежнему выполняет эти два метода по отдельности, что приводит к получению двух разных транзакций.
Простым решением будет:
- использовать базу данных (без состояния в SLSB), которую можно синхронизировать с вашей транзакцией EJB,
- выполнить оба эти метода в транзакции (например, метод
incrementAndGet(-)
для клиента WebService).
Чем вы можете быть уверены, что полученные результаты соответствуют.