2014-10-14 6 views
1

여기는 최근에 읽은 oracle blog의 문단입니다.Stateful Bean은 EJB의 컨테이너 또는 응용 프로그램으로 관리됩니까?

이 동작은 Stateful 세션 빈의 동작과 매우 다릅니다. Stateful 세션 빈 인스턴스는 @Remove로 주석 처리 된 메소드의 호출로 클라이언트에 의해 명시 적으로 제거되어야합니다. 컨테이너에 의해 자동으로 삭제되지는 않습니다. 그것은 어떤 맥락에도 구속되지 않는다. Stateful 세션 빈을 HttpSession과 연관 시키면, HttpSession의 끝이나 타임 아웃에서 안정적인 폐기에 대해서도주의해야한다.

이에 따르면 stateful session을 제거한 후 응용 프로그램을 제거해야합니다.

그러나 두 권의 책을 읽었습니다. @Remove이 호출되지 않으면 컨테이너는 범위에서 콩을 제거하지만 자체 재량으로 제거합니다.

그래서 나는 옳은 것이 무엇인지 알고 싶습니까? @stateful 명시 적으로 제거하거나 모든 경우에 제거하기 위해 컨테이너에두고해야하는지 그것을 수행 제거

편집

내가 Beginning Java EE7 by Antonio Goncalves 인용 - 훌륭한 책; 페이지 243 (pdf)

선택적 @ javax.ejb.StatefulTimeout 및 @ javax.ejb.Remove 주석에 유의하십시오. @Remove는 checkout() 메소드를 장식합니다. 이렇게하면 checkout() 메소드를 호출 한 후에 Bean 인스턴스가 메모리에서 영구적으로 제거된다. @StatefulTimeout은 컨테이너가 제거하기 전에 Bean이 유휴 (클라이언트 호출을받지 않음) 상태로 유지되는 기간 인 시간 종료 값을 지정합니다. 이 주석의 시간 단위는 java.util.concurrent.TimeUnit이므로 DAYS, HOURS ...에서 NANOSECONDS (기본값 : 은 MINUTES)까지 갈 수 있습니다. 또는 이러한 주석을 피하고 클라이언트 세션이 끝나거나 만료 될 때 자동으로 컨테이너에 인스턴스를 제거 할 수 있습니다. 그러나 적절한 순간에 상태 저장 빈이 제거되었는지 확인하면 메모리 소비가 줄어들 수 있습니다. 이는 동시 처리가 많은 응용 프로그램에서 중요 할 수 있습니다.

+0

내가 읽은 것을 다음과 같이 해석합니다. "SFSB를 직접 관리하지 않으면 누적되고 메모리가 낭비되어 결국 컨테이너가 정리하려고합니다 ... _" – jahroy

+0

@ jahroy : 책의 텍스트를 인용했습니다 –

+0

"읽은 책 _" – jahroy

답변

2

FileInputStream과 유사합니다. 예, FileInputStream에는 최종 사용자가 없으면 자동으로 닫히는 최종자가 있지만 예상 한 프로그래밍 모델은 파일 기술자가 누출되지 않도록 작업을 완료 할 때 명시 적으로 닫는 것입니다.

동일한 내용은 stateful 세션 bean에도 해당됩니다. 예, 명시 적으로 제거하지 않고 (컨테이너가 너무 빨리 수행하지 못하도록하는 표준 옵션이있는 경우에도) EJB 컨테이너는 액세스 시간 초과 후 인스턴스를 정리합니다. 그러나 예상되는 프로그래밍 모델은 명시 적으로 완료되면이를 제거하여 stateful 빈 인스턴스가 소비 한 자원을 시스템에 리턴 할 수 있도록하십시오.