2009-08-26 3 views
0

EJBBean을 클라이언트에서 호출하려면 먼저 JNDI 조회를 통해 EJBHome 객체 참조를 확보해야합니다. 이 코드는 EJBBean으로 작업해야 할 때마다 실행해야하므로 중복되거나 비용이 많이 듭니다.EJBHomeFactory 패턴을 구현할 때 동기화 된 맵이 필요합니까?

이 문제를 해결하려면 JNDI 조회를 반복하지 않고 EJBHome 개체 참조를 캐시하고 캐시에서 반복적으로 다시 사용할 수 있습니다.

이것은 EJBHomeFactory Pattern (또는보다 일반적인 서비스 검색 도구 패턴)입니다.

내가 본 대부분의 구현에서는 동기화 된 Map을 캐시로 사용하거나 Hashtable을 사용합니다. 응용 프로그램이 서버에 배포되었을 때 캐시가 생성되고 나중에 캐시를 수정하지 않으면 (get() 메서드 만 수행됨) 실제로 Map 또는 HashMap 동기화가 필요합니까?

내가 알고있는 HashMap 적어도 하나의 스레드가지도를 수정하면 안전하지 않습니다 (이 경우에도 here에 게시 됨).이 경우 스레드는 읽기만 수행합니다.

따라서 EJBHomeFactory Pattern에서 HashMap을 사용해도 안전합니까?

답변

0

설명대로 라이프 사이클을 보장 할 수 있다면 비동기 HashMap이 정상적으로 작동하는 것 같습니다. 그러나 본능은 이것이 현재 전개 패턴에 취약한 의존성을 보이고 있다는 것입니다.

동기화 된 데이터 구조를 사용하는 경우 을 알면은 현재 안전하고 미래에 안전합니다. 동기화가 성능에 진정으로 영향을 준다는 구체적인 증거가 없다면 "분명히 올바른"구현으로 진행할 것입니다.

지나치게 많은 주요 앱 서버는 실제로 JNDI 조회 결과를 캐시하므로 실제로 사용하는 패턴을 얼마나 절약했는지는 분명하지 않습니다.하지만 필자는 직접 사용하는 경향이 있음을 인정해야합니다.

EJB 참조 자체는 재사용 할 수 있으므로 실제로 집으로가는 빈도는 매우 낮게 유지 될 수 있습니다. 극한의 성능이 목표라면 이는 더 많은 탐구가 될 것입니다.