Stateless 세션 Bean을 통해 Stateful 세션 Bean을 언제 사용합니까?


82

Stateful 세션 Bean은 다음과 같이 정의됩니다.

Stateful Session Beans 객체의 상태는 인스턴스 변수의 값으로 구성됩니다. Stateful 세션 Bean에서 인스턴스 변수는 고유 한 클라이언트 Bean 세션의 상태를 나타냅니다. 클라이언트가 Bean과 상호 작용 ( "대화")하기 때문에이 상태를 종종 대화 상태라고합니다.

상태 비 저장 세션 Bean은 다음과 같이 정의됩니다.

Stateless Session Beans Stateless 세션 Bean은 클라이언트와의 대화 상태를 유지하지 않습니다. 클라이언트가 stateless bean의 메소드를 호출 할 때 bean의 인스턴스 변수는 해당 클라이언트에 특정한 상태를 포함 할 수 있지만 호출 기간 동안 만 가능합니다. 메서드가 완료되면 클라이언트 별 상태가 유지되지 않아야합니다. 그러나 클라이언트는 풀링 된 상태 비 저장 빈에서 인스턴스 변수의 상태를 변경할 수 있으며이 상태는 풀링 된 상태 비 저장 빈의 다음 호출로 유지됩니다. 메소드 호출 동안을 제외하고 상태 비 저장 빈의 모든 인스턴스는 동일하므로 EJB 컨테이너가 모든 클라이언트에 인스턴스를 할당 할 수 있습니다. 즉, Stateless Session Bean의 상태는 모든 클라이언트에 적용되어야합니다.

Stateful 세션 Bean에 비해 Stateless 세션 Bean을 사용하는 이점은 다음과 같습니다.

Stateless Session Bean은 여러 클라이언트를 지원할 수 있기 때문에 많은 클라이언트가 필요한 애플리케이션에 더 나은 확장 성을 제공 할 수 있습니다. 일반적으로 애플리케이션은 동일한 수의 클라이언트를 지원하기 위해 Stateful 세션 Bean보다 적은 Stateless 세션 Bean을 필요로합니다.

그래서 떠오르는 질문은 언제 Stateful Session Bean을 사용해야 하는가입니다. 이 문제에 대한 순진한 이해를 위해 가능한 한 stateless 세션 빈을 사용해야합니다.

Stateful Session Bean을 사용해야하는 후보는 무엇입니까? 좋은 예가 있습니까?

세션 빈


답변:


150

먼저 서버에서 Bean이 생성되고 처리되는 방식을 이해해야합니다.

대한 무 상태 세션 빈 서버는 풀에 인스턴스 변수 양을 유지할 수 있습니다. 클라이언트가 이러한 상태 비 저장 빈을 요청할 때마다 (예 : 메소드를 통해) 해당 요청을 처리하기 위해 임의의 인스턴스가 선택됩니다. 즉, 클라이언트가 두 개의 후속 요청을 수행하면 Stateless Bean의 두 가지 다른 인스턴스가 요청을 처리 할 수 ​​있습니다. 실제로 두 요청 사이에는 대화 상태가 없습니다. 또한 클라이언트가 사라지면 상태 비 저장 빈은 파괴되지 않고 다른 클라이언트의 다음 요청을 처리 할 수 ​​있습니다.

반면에 Stateful 세션 빈 은 클라이언트와 밀접하게 연결되어 있습니다. 각 인스턴스는 생성되고 단일 클라이언트에 바인딩되며 해당 특정 클라이언트의 요청 만 제공합니다. 따라서 Stateful Bean에서 두 개의 후속 요청을 수행하면 요청이 항상 동일한 Bean 인스턴스에서 제공됩니다. 즉, 요청간에 대화 상태를 유지할 수 있습니다. 수명주기가 끝나면 클라이언트는 제거 메소드를 호출하고 빈은 가비지 수집을 위해 파괴 / 준비됩니다.

Stateless 또는 Stateful을 언제 사용해야합니까?

그것은 주로 대화 상태 를 유지할 것인지 여부에 따라 다릅니다 . 예를 들어 두 개의 숫자를 더하고 결과를 반환하는 메서드가있는 경우 일회성 작업이기 때문에 상태 비 저장 빈을 사용합니다. 이 메서드를 다른 번호로 두 번 호출하면 이전 추가 결과에 더 이상 관심이 없습니다.

그러나 예를 들어 클라이언트가 수행 한 요청 수를 세고 싶다면 Stateful Bean을 사용해야합니다. 이 시나리오에서는 클라이언트가 이전에 빈 메서드를 얼마나 자주 요청했는지 아는 것이 중요하므로 빈에서 대화 상태를 유지해야합니다 (예 : 변수 사용). 여기에서 stateless bean을 사용하면 클라이언트의 요청이 매번 다른 bean에서 제공되어 결과가 엉망이됩니다.


15
" 클라이언트가 사라지면 빈도 파괴됩니다 ". 실제로 stateful 세션 빈은 @Remove( javax.ejb)로 장식 된 메서드가 명시 적으로 호출 되지 않는 한 자동으로 파괴되지 않습니다 (해당 메서드는 코딩 할 필요도 없습니다.으로 주석 처리 된 경우 단순히 비어 있거나 공백으로 둘 수 있음 @Remove). 연관된 클라이언트가 Stateful 세션 Bean을 파괴하는 것을 잊은 경우 해당 Bean은 컨테이너 자체가 자체 정책을 사용하여 제거하기로 결정할 때까지 서버에 계속 매달려 있습니다. 내가 잘못하고 있습니까?
Tiny

3
물론 당신이 옳습니다. 콩 라이프 사이클에 대한 자세한 정보는 여기에서 찾을 수 있습니다 docs.oracle.com/javaee/6/tutorial/doc/giplj.html을
tobiasdenzler

48

Stateful 세션 빈 을 사용하는 가장 좋은 예는 사용자가 구매하려는 모든 제품을 저장 하는 쇼핑 카트 라고 생각합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.