2011-05-06 4 views
4

정적 개체는 한 번만 초기화됩니다. 싱글 톤 클래스는 한 번만 인스턴스화됩니다. 클러스터에서 싱글 톤을 사용하면 클러스터에 싱글 톤 인스턴스가 여러 개 생성됩니다. 그러면 클러스터 환경에서 정적 개체는 어떻게됩니까? 이 개체가 다른 클러스터 서버에서 초기화되지 않은 이유는 무엇입니까? 또는 객체 상태가 변경되지 않는 이유는 무엇입니까?클러스터링하는 동안 정적 객체는 어떻게 처리됩니까?

+0

복제본 http://stackoverflow.com/questions/5909799/caching-mechanism-cluster-environment/5910303#5910303 –

답변

3

정적 객체는 항상 ClassLoader의 범위에 있고 (대부분의 경우 JVM 당) 클러스터링에서는 고려되지 않습니다. 싱글 톤이 필요하다면 컨테이너에 컨테이너를 생성하라고 지시해야합니다. 클러스터 당 하나 또는 JVM 당 하나 또는 Classloader 당 한 번만 존재해야하는 경우 Singleton의 특성에 따라 다릅니다.

3

클러스터의 각 노드는 별도의 JVM에서 실행되므로 각 JVM (클러스터 노드)은 자체 Singleton을 갖습니다. 클러스터를 JVM의 시스템으로 보면 클러스터의 Singleton 인스턴스 수가 노드 수와 동일하다는 것은 사실입니다.

클러스터 전체 싱글 톤은 일반 Java 클래스로 구현할 수 없습니다. 싱글 톤을 제공하는 단일 (클러스터되지 않은) 서버 인스턴스가 필요할 수 있습니다.

2

싱글 톤은 단일 프로세스 내에서도 신뢰할 수 없습니다. 여러 클래스 로더를 통해 동일한 클래스를로드하고 여러 '싱글 톤'객체로 끝낼 수 있습니다.

싱글 톤은 이유 때문에 반 패턴입니다 - 피하십시오.

싱글 톤의 위치를 ​​결정하기 위해 모든 노드가 조정되어야하기 때문에 클러스터의 경우가 훨씬 더 심각합니다. 이것은 네트워크 파티셔닝에 취약하기 때문에 유지가 불가능합니다. Brewer의 CAP Theorem에서 이에 대한 배경 지식을 제공합니다.

+0

자주 사용 사례에 따라 다릅니다. 어떤 범위 (즉, ClassLoader 당)에 "싱글 톤"을 갖는 것으로 충분합니다. 일부 데이터를 캐싱합니다. 전체 캐시가 모든 사용자에게 표시되지 않으며 중복되거나 다른 데이터가 포함될 수 있기 때문에 효율성이 떨어질 수 있지만 제한 사항을 알고 있으면 패턴을 적용해도 괜찮습니다. – rurouni

관련 문제