2017-09-04 1 views
0

에서 스레드로부터 안전합니다.보증 내가 J2EE에이 디자인 패턴을 사용하는 J2EE

퀴즈 1 : 스레드 안전성이 보장됩니까?

퀴즈 2 : 클래스가 Stateful EJB로 변경되면 어떻게 되었습니까? 스레드 안전합니까?

+2

스레드로부터 안전하지 않을뿐만 아니라 서버마다 '해시 테이블 내용'이 다를 수 있습니다. 서버가 물리적/가상 머신이 아니라 JVM별로 - 동일한 "머신"에서 실행되지만 다른 서버 인스턴스에서 실행되는 경우에도 (a) 스레드 안전 보장 및 (b) 내용 '달라질 것입니다. 분산 된 캐싱 솔루션 (예 : Ehcache, Hazelcast, Infinispan)을 살펴볼 수 있습니다. –

+0

@NikosParaskevopoulos 감사합니다. 이 프로그램이 하나의 jvm에서만 실행된다고 생각하면 어떤 상황이 발생합니까? 분산 캐싱 솔루션은 자동으로 glassfish에 있지 않습니다? – DanialAbdi

답변

1

glashfish를 실행하는 세 서버간에 빈을 공유하려는 경우 엔터티 빈과 함께 EJB 지속성을 사용해야하며 비 상태 또는 상태 기반 세션 빈을 사용하지 않아야합니다.. 그러나 EJB 영속성은 정적 멤버들에게는 작동하지 않을 것이다.

public class myClass{ 
    private Hashtable<Integer, ContentClass> contents = new Hashtable<Integer, ContentClass>(); 
    public synchronized void m1(){ 
//some work on contents 

} 
public synchronized void m2(){ 
    //another some work on contents 
} 

을 어떻게 매핑의 일종으로 contents을 유지하는 컨테이너를 설명하는 주석 또는 다른 수단을 추가

따라서, 당신은 써야한다.

이렇게하면이 엔티티 bean을 공유 데이터 소스에 유지할 수 있으며 세 서버가이를 올바르게 액세스 할 수 있습니다. 따라서이 빈의 인스턴스를 관리하려면 데이터 소스, 지속성 단위 및 엔티티 관리자를 정의해야합니다.

이렇게하면 코드가 스레드로부터 안전 해집니다. contents에 액세스하는 것이 올바르게 수행됩니다.

+0

고맙습니다. 귀하의 대답은 나를 위해 매우 유용하며 새로운 접근 방식을 보여줍니다. – DanialAbdi

관련 문제