문제

우리는 웹 계층에 여러 요청에 서비스를 제공하는 주어진 서블릿의 단일 인스턴스 만 존재할 가능성이 있음을 알고 있습니다. 예를 들어 변수에서 스레딩 문제로 이어질 수 있습니다.

내 질문은 @EJB 주석을 인스턴스 변수로 서블릿에 사용하여 EJB를 주입하는 것이 안전합니까?

EJB의 동일한 사례가 동시에 여러 요청을 서비스 할 것이라는 가정하에 내 초기 본능은 아니오입니다. 이것은 또한 다른 많은 프로그래머들의 본능이 될 것 같습니다. 서블릿에 주입하지 마십시오

그러나 나는 잘못된 결론에 뛰어 들었다. 분명히 서블릿에 주입되는 것은 프록시입니다. 후드 아래 컨테이너는 실제로 각각의 요청을 다른 인스턴스로 서비스하고 스레드 안전을 유지합니까? 이 포럼이 제안한 것처럼 : 서블릿에 주입하십시오

상충되는 의견이 많이있는 것 같습니다. 어느 것이 맞습니까 ???

도움이 되었습니까?

해결책

"서블릿에 주입하지 마십시오"는 EJBS 또는 @EJB 주석에 대해 언급하지 않습니다. 그것은 persistencecontext와 같은 스레드 안전 객체가 아닌 것에 대해 이야기합니다.

EJB 사양 당 서블릿 (EJB 3.0 사양) - 섹션 3.1)를 포함한 다양한 원격 클라이언트에서 EJB에 액세스 할 수 있습니다. @EJB 주석을 사용하여 EJB를 주입하는 것은 JNDI 네임 스페이스에서 EJB 객체를 찾는 대안 인 종속성 주입 (섹션 3.4.1)을 통해 EJB 인터페이스를 얻는 방법입니다. 따라서 EJB와 관련하여 @EJB 주석에 대해 특별한 것은 없습니다.

따라서 EJB 3.0 사양을 기반으로 @EJB 주석을 사용하여 서블릿에서 EJB를 얻는 표준 관행입니다.

다른 팁

EJB가 상태가없는 한 서블릿 인스턴스 변수로 서블릿에서 EJB를 주입하는 것이 안전합니다. 서블릿에 상태가 많은 콩을 주입해서는 안됩니다.

EJB Sationeless는 인스턴스 변수를 보유하지 않는다는 점에서 상태 값 (지속성 컨텍스트)을 보유하고 있다는 점에서 구현해야합니다. 지속성 컨텍스트를 사용해야하는 경우 EJB의 방법에서 인스턴스를 가져와야합니다. EJB 인스턴스 변수로서 영구적으로 텍스트를 사용하여이를 수행 한 다음 EJB 방법으로 공장에서 엔티티 관리자의 인스턴스를 얻을 수 있습니다.

persistenceContextRactory는 스레드-안전하므로 인스턴스 변수에 주입 될 수 있습니다.

위에서 언급 한 규칙을 준수하는 한, 서블릿에 무국적 콩을 주입하는 것은 스레드 안전이어야합니다.

혼합 가방입니다.

무국적 세션 콩이 주입되어 안전 할 수 있습니다. 스터브의 단일 인스턴스가 사용 되더라도 컨테이너에 의해 방법에 대한 액세스가 직렬화되기 때문입니다.

나는 추론한데 디자인의 말이 무엇이라고 생각합니다 사실이 아니다. 무국적 세션 Bean이 지속성 컨텍스트를 사용하는지 여부는 중요하지 않습니다. 한 발신자만이 단일 Bean 인스턴스에 동시에 액세스 할 수 있으므로 지속 컨텍스트가 스레드 안전하지 않더라도 EJB는 여러 액세스에 대한 경비원입니다. 모든 세션 Bean 방법에 동기화 된 키워드가 적용되는 것처럼 생각하십시오.

서블릿에 EJB를 주입하는 데있어 주요 문제는 성능이라고 생각합니다. 세션 Bean 메소드가 실행되기를 기다리는 동안 여러 요청이 대기 중일 때 단일 스터브 인스턴스가 주요 경합 영역이됩니다.

간단한 대답은 안전하다는 것을 보장하지 않는다는 것입니다.

그 이유는 EJB 홈 인터페이스가 스레드 안전해야한다는 EJB 사양에 명시적인 것이 없기 때문입니다. 사양은 서버 측 부분의 동작 만 설명합니다. 아마도 당신이 찾을 수있는 것은 클라이언트 골격이 실제로 스레드 안전이지만 사용중인 라이브러리에서 구현하는 방법을 살펴 봐야한다는 것입니다. 주석 부분은 서비스 로케이터로 확장하여 아무것도 사지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top