Переменная класса в EJB 3 является потокобезопасной? - PullRequest
1 голос
/ 05 ноября 2011

В сервлете, потому что он синглтон, кроме орудия SingleThreadModel.Ссылка на эту статью https://www.fortify.com/vulncat/en/vulncat/java/singleton_member_field_race_condition.html

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

Например, classVar1 - это переменная класса, я инициализирую ее в конструкторе и использую позже.В сервлете это может иметь проблему, но в EJB 3 все должно быть в порядке, верно?

@Stateles
public class HelloBean implements Hello {

    ObjectXXX classVar1;

    public HelloBean() {
        ObjectXXX classVar1 = new ObjectXXX();
    }

    public String doHello(String message) {
        return message + classVar1.method1();
    }
}

И еще один вопрос заключается в том, что ресурс (то есть EntityManager в JPA), введенный в EJB, долженбыть потокобезопасным?

1 Ответ

2 голосов
/ 05 ноября 2011

Контейнер должен позволять только 1 поток в конкретном экземпляре EJB, поэтому: каждый метод может быть выполнен только одним потоком, а ваша переменная является «безопасной» (как вы инициализируете ее в конструкторе или @PostConstruct методе).

Однако , SLSB (EJB без сохранения состояния) должен не использоваться для сохранения состояния.EJB объединяется, поэтому у вас нет никаких гарантий, что вы вернетесь к тому же экземпляру.SFSB создан для этой цели.

EntityManager, как и каждое поле экземпляра в EJB, является поточно-ориентированным.

Однако , сам EntityManager не поточно-безопасный и не может использоваться в среде, где к нему могут обращаться более 1 потока (т. е. в сервлете).EntityManagerFactory следует использовать вместо этого в таких случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...