2017-11-22 16 views
0

그냥 생각한 실험. 나는 그것이 어떻게 사용되어 지는지 절대적으로 알지 못한다. 그러나 을 알고 싶다. 시스템이 고장 나거나 문제를 일으킬 수있다.긴 수명의 객체에서 상태 비 저장 EJB에 대한 참조를 보유하면 어떻게됩니까?

수명이 예상보다 긴 세션이나 응용 프로그램 범위 또는 다른 종류의 개체를 상상해보십시오. 어떤 @Stateless EJB 필드가 생성자 또는 설정자에 의해 수신되어 그 참조를 영원히 보유합니다.

EJB와 컨테이너는 어떻게됩니까?

답변

2

"stateless EJB 필드"는 Stateless EJB에 대한 참조입니다.

그러나 EJB 인스턴스를 직접 참조하지는 않습니다. 참조 된 객체는 EJB에 대한 proxy입니다.

해당 프록시를 통해 메소드를 호출 할 때마다 컨테이너는 EJB 인스턴스에 대한 참조를 작성하거나 가져 와서 호출합니다. 컨테이너는 EJB 인스턴스를 빠르게 수집 할 수 있도록 이러한 EJB 인스턴스 풀을 가질 수 있습니다. 이것은 결국 Stateless이기 때문에 가능합니다.

이있는 경우 :

public class Foo { 

    @EJB 
    private Bar myStatelessEJB; 

    public void doSomething() { 
     myStatelessEJB.eat(); 
     myStatelessEJB.something(); 
    } 

} 

그런 다음 myStatelessEJB의 각 호출은 Bar의 완전히 다른 인스턴스를 호출 할 수 있습니다.

따라서 EJB에 대한 참조를 얼마나 오래 유지하는지는 아무런 차이가 없습니다. 컨테이너는 호출간에 완전히 잊어 버릴 수도 있고 다른 클라이언트를 위해 풀로 반환 할 수도 있습니다.

+0

흥미 롭습니다. 예를 들어, 싱글 톤에 대한 참조를 유지하는 것은 내가 생각한 그런 끔찍한 관행이 아닙니까? – Faerindel

+0

무엇? [@ javax.ejb.Singleton] (https://javaee.github.io/javaee-spec/javadocs/javax/ejb/Singleton.html)? 너는 이것들에 대해 묻지 않았다. –

+0

아니, 나는 보통의 것을 의미한다. – Faerindel