5

@EJB 주석을 사용하는 동안 가능한 성능 문제와 관련된 질문이 있습니다. 다음 시나리오를 상상해보십시오.@EJB 삽입 대 조회 - 성능 문제

public class MyBean1 implements MyBean1Remote{ 
@EJB 
private MyBean2Remote myBean2; 
@EJB 
private MyBean2Remote myBean3; 
... 
@EJB 
private MyBean20Remote myBean20; 
} 

다른 bean에 많은 종속성이있는 bean이 있습니다. EJB 스펙에 따르면 MyBean1Remote를 다른 Bean에 주입하고자 할 때 컨테이너는 풀에서 필요한 모든 의존성을 가져와 MyBean1Remote에 주입 한 다음 MyBean1Remote 스텁에 대한 참조를 주입해야한다.

지금 예약 20 EJB를 (myBean1과 19 개 종속)

public class MyAnotherBean implement MyAnotherRemote{ 
    @EJB 
    private MyBean1Remote myBean1 
} 

수 있도록 시나리오 컨테이너에 필요한 다음의 대부분의 경우 우리는 myBean1의 각 사업 방법 당 한 하나의 의존성을 사용하는 것을 말한다. 결과적으로 우리가 빈을 삽입하기를 원할 때마다 우리는 컨테이너가 많은 불필요한 EJB를 확보하도록 강제합니다. 또한 원격 Bean에서 작업 중이라고 가정하므로 컨테이너는 종속 Bean을 주입하기 전에 일부로드 균형 알고리즘을 수행해야합니다.

질문 :

  1. 성능 문제를 통해 그 원인 불필요한 자원 예약 및 더 클러스터 환경에서 작동하지 않을까요 동안?

  2. 아마 우리가 정말로 필요할 때이 접근법으로 특정 EJB를 요청할 것이므로 좋은 ServiceLocator가 더 나은 해결책 일 수 있습니까?

답변

5

대부분의 경우 특히 상태 비 저장 세션빈을 사용할 때 빈 인스턴스가 풀링됩니다. 풀링의 근거 중 하나는 종속성 주입 조회가 상대적으로 비용이 많이들 수 있으므로 콩이 이미에 주입 된 종속성 (스텁)을 가진 풀 입니다.

따라서 MyAnotherBean에서 메소드를 호출 할 때마다 20 개의 전이 종속성을 가진이 Bean은 모든 의존성이 즉시 생성되어 작성되지 않습니다. 대신 완전히 인스턴스화 된 인스턴스가 풀에서 선택되고 메소드 호출이 풀에 지시됩니다.

JNDI 제휴를 수행하지 않는 한 일반적으로 원격 EJB를 쉽게 삽입 할 수 없습니다.

12

컨테이너는 EJB 인스턴스를 주입하지 않습니다. 그것은 원하는 인터페이스를 구현하는 경량 컨테이너 생성 프록시 객체의 인스턴스를 주입한다. 하여 예에서

public class MyBean1 implements MyBean1Remote { 
    ... 
} 

public class MyAnotherBean implement MyAnotherRemote { 
    @EJB 
    private MyBean1Remote myBean1; 
} 

는 MyAnotherBean.myBean1는 MyBean1Remote 인터페이스를 구현하는 프록시 객체를 주입한다.

무 상태 세션 bean (풀링에 대해 언급 했으므로)은 메소드가 프록시에서 호출되고 인스턴스가 풀로 리턴 될 때까지 메소드 준비 풀에서 실제 EJB 인스턴스를 할당하지 않습니다 프록시 메소드 호출이 돌아 오기 전에

+0

+1 예, 이것도 좋은 대답입니다. 인스턴스 자체는 주입되지 않지만 프록시는 있습니다. 그 다음으로, 내 대답과 마찬가지로 풀의 실제 인스턴스에는 이미 모든 종속성이 해결됩니다. –