2012-03-01 5 views
10

У меня есть EJB, который должен быть синглом и stateful, поскольку он станет своего рода пулом соединений. Мои вопросы:@Singleton in java EJB

  • Если я определяю EJB с @Singleton аннотацию, это будет тогда с сохранением состояния по умолчанию, или я должен определить его @Stateful также?
  • Может быть, для @Stateless аннотация?

Попытался найти документацию об этом, но пока не повезло, поэтому любой обладающий знаниями, пожалуйста, поделитесь своей мудростью и, возможно, ссылкой или двумя.

ответ

13

EJB tutorials показывает, что EJB может быть как Singleton, так и Stateful или или без гражданства. Я никогда не пытался использовать более одного из этих аннотаций, но я вполне уверен, что правильное решение - использовать только один из них.

С этой ссылке:

Singleton сессионные компоненты сохраняют свое состояние между клиентом вызовы

Таким образом, на ваш вопрос:

если я определяю EJB с @Singleton аннотация будет ли она по умолчанию по умолчанию, или я должен определить ее с помощью @Stateful?

Если для Stateful вы имеете в виду способность поддерживать свое состояние, то ответ: да, по умолчанию Singleton будет Stateful.

Имейте в виду, что существуют определенные ситуации, в которых Singleton не ведет себя как Singleton, прочтите это article об этом. Как правило, вы не запускаете такой риск, если находитесь за пределами кластера и не используете конструктор по умолчанию: вам нужно всегда использовать ссылки EJB, введя его в другом EJB или веб-клиенте, используя:

@EJB MyEJB myEJB; 

Наконец, посмотрите на часть учебника Java EE 6, посвященную жизненному циклу EJB, пояснив, что основным отличием между Stateful и другими EJB является способность пассивироваться контейнером в течение его жизни. Это различие является основной причиной того, что утверждение «Синглтон по умолчанию по умолчанию» неверно, но верно в контексте вашего вопроса.

+0

Спасибо за хорошие рекомендации. Я немного волнуюсь, потому что он говорит в учебнике Java EE 6: «В конце жизненного цикла контейнер EJB вызывает метод аннотированный @PreDestroy, если он существует. Синтаксический сеансовый компонент теперь готов к сбору мусора. " Это произойдет только тогда, когда я закрою свой сервер приложений или это произойдет иначе? – Marthin

+1

Мой опыт в том, что это произойдет только тогда, когда приложение будет отключено или отключено или сервер будет отключен. – perissf