2008-09-25 2 views
26

Java의 Stateless beans는 클라이언트로부터의 두 번의 호출 사이에 상태를 유지하지 않습니다. 간단히 말해 비즈니스 메소드가있는 객체로 간주 할 수 있습니다. 각 메서드는 매개 변수를 사용하고 결과를 반환합니다. 메서드가 호출되면 실행 스택에 일부 로컬 변수가 만들어집니다. 메소드가 리턴 할 때 지역 변수가 스택에서 제거되고 일부 임시 오브젝트가 할당 된 경우 어쨌든 가비지 수집됩니다.왜 Stateless 세션 빈을 풀링합니까?

별도의 스레드로 동일한 단일 인스턴스의 메서드를 호출하는 것과 다르지 않습니다. 그렇다면 컨테이너가 여러 개의 빈을 풀링하는 대신 하나의 빈 인스턴스를 사용하는 이유는 무엇입니까?

답변

27

풀링은 여러 가지 작업을 수행합니다.

하나는 인스턴스 당 하나의 빈을 사용하므로 스레드 안전성이 보장됩니다 (예 : 서블릿은 스레드로부터 안전하지 않음).

둘째, Bean이 가질 수있는 잠재적 시작 시간을 줄입니다. 세션 빈은 "상태 비 저장"이지만 클라이언트와 관련하여 상태 비 저장 만 필요합니다. 예를 들어, EJB에서는 여러 서버 리소스를 Session Bean에 주입 할 수 있습니다. 그 상태는 빈에게 비공식이지만 호출에서 호출까지 그것을 유지할 수있는 이유는 없습니다. 따라서 빈을 풀링하면 빈을 생성 할 때만 이러한 조회가 줄어 듭니다.

세, 트래픽을 조절하는 수단으로 빈 풀을 사용할 수 있습니다. 풀에 10 개의 Bean 만있는 경우 최대 10 개의 요청을 동시에 처리 할 수 ​​있으며 나머지는 대기열에 있습니다.

+3

"하나는 인스턴스 당 하나의 빈을 사용하므로 스레드 안전성이 보장됩니다 (예 : 서블릿은 스레드로부터 안전하지 않습니다)." 스테이트리스 세션 빈에서 스레드 안전 도움말이되는 방법은 무엇입니까? – anjanb

+0

서블릿이 스레드로부터 안전하지 않다는 것을 의미 할 때 무슨 뜻인지 이해할 수 없습니다. IIRC에서 Tomcat 관리 콘솔을 사용하면 Servlet을 풀링 할 수도 있습니다. – Alan

+1

Stateless Session Beans는 단순한 구성 요소입니다.그들은 "State"를 가질 수 있지만 상태는 클라이언트가 아닌 구성 요소와 관련이 있습니다. 빈은 전체 라이프 사이클을가집니다. 따라서 빈과 같은 지역 캐시를 가질 수 있으며이를 동기화하는 것에 대해 걱정할 필요가 없습니다. –

0

Statelesss 세션 Bean의 라이프 사이클은 존재하지 않으며, 수동 및 MethodReady (수동 또는 비활성) 상태입니다. 빈도를 최적화하려면 작성에서 메소드 준비 상태로 Bean을 탐색하는 대신 컨테이너가 활성 상태 컨테이너 콜백을 통한 패시브 상태 - 빈 풀을 관리하여 ejbActivate() 및 ejbPassivate()를 호출합니다.

sreenut

1

풀링 성능이 향상됩니다.

모든 요청/스레드를 처리하는 단일 인스턴스는 많은 경합 및 차단을 초래합니다.

어떤 인스턴스가 사용되고 (여러 스레드가 동시에 하나의 인스턴스를 사용할 수 있는지) 모르므로 Bean은 스레드 안전해야합니다.

컨테이너는 실제 작업을 기반으로 풀 크기를 관리 할 수 ​​있습니다.

1

Java EE 모델의 트랜잭션 성은 트랜잭션 컨텍스트를 사용하여 트랜잭션 수명주기를 관리합니다.

이 단순화는 UserTransaction 객체와 직접 상호 작용할 특정 인터페이스를 구현할 필요가 없도록하기 위해 존재합니다. 트랜잭션이 InitialContext로부터 검색 될 때 (또는 세션 빈에 주입 될 때) 재사용을 위해 스레드 로컬 변수에 바인드됩니다 (예를 들어, Stateless Session Bean의 메소드가 삽입 된 트랜잭션을 사용하는 다른 Stateless Session Bean을 호출하는 경우).)

관련 문제