클러스터에서 Java 동기화 된 블록을 공유하거나 글로벌 잠금을 사용합니까?

StackOverflow https://stackoverflow.com/questions/1228833

문제

하나의 스레드 만 액세스 할 수있는 코드가 있습니다. 나는 이것을 사용하여 이것을 달성하는 방법을 알고 있습니다 synchronized 차단 또는 방법이지만 클러스터 된 환경 에서이 작업이 작동합니까?

대상 환경은 Cluster에 2 개의 노드가있는 WebSphere 6.0입니다.

나는 그 느낌이있다 synchronized 각 노드의 응용 프로그램의 각 인스턴스에 자체 JVM이 있으므로 작동하지 않습니까?

내가 여기서하려는 것은 시스템이 부팅 될 때 데이터베이스 레코드에 대한 업데이트를 수행하는 것입니다. 코드의 버전보다 오래된 데이터베이스 레코드를 찾고 특정 작업을 수행하여 업데이트합니다. 각 작업 항목이 한 번만 업그레이드되고 이러한 업그레이드의 성능이 큰 관심사가 아니기 때문에 하나의 노드만이 업그레이드를 수행하기를 원합니다. 응용 프로그램 시작에서만 발생하기 때문에 큰 관심사가 아니며 실제로 아무것도 수행하지 않기 때문입니다. 코드가 마지막으로 시작된 이래로 변경되었을 때.

데이터베이스는 DB2V9이며 JNDI (ORM 레이어 없음)를 통해 직접 액세스하고 있습니다.

글로벌 잠금 장치가 여기로가는 길이라고 제안되었지만 어떻게 해야할지 잘 모르겠습니다.

이 경기장에 포인터가 있습니까?

감사!

도움이 되었습니까?

해결책

프로세스 전체의 동기화는 Java 동기화 구조를 사용하여 작동하지 않는 것이 맞습니다. 다행스럽게도 문제는 실제로 코드 동기화 중 하나가 아니라 데이터베이스와 상호 작용을 동기화하는 것이 아닙니다.

이 문제를 다루는 올바른 방법은 데이터베이스 레벨 잠금입니다. 아마도 DB 스키마 버전이 포함 된 일부 테이블이 있으므로 시작/업그레이드 프로세스 기간 동안 해당 테이블을 잠그십시오.

데이터베이스 유형 (DB2?) 및 액세스 방법 (RAW SQL, JPA 등)을 지정하면 관련된 정확한 SQL/DB 통화가 더 명확 할 수 있습니다.

업데이트 (8/4/2009 2:39 pm): 나는 제안한다 잠금 테이블 스키마의 버전 #을 보유한 일부 테이블의 명령문. 이렇게하면 해당 테이블에 대한 액세스를 직렬화하면 두 인스턴스가 업그레이드 코드를 한 번에 실행하지 못하게됩니다.

다른 팁

예, 당신은 그것에 맞습니다 동기화 블록은 클러스터에서 작동하지 않습니다. 그 이유는 당신이 언급했듯이, 각 노드에는 자체 JVM이 있기 때문입니다.

그러나 단일 노드 환경에서 작동 할 때 동기화 된 블록이 클러스터에서 작동하도록하는 방법이 있습니다. 가장 쉬운 방법은 제품과 같은 제품을 사용하는 것입니다 테라코타, 이는 다른 JVMS 사이의 스레드 조정을 처리하여 클러스터 전체에 걸쳐 일반 동시 컨트롤을 사용할 수 있습니다. 이것이 어떻게 작동하는지 설명하는 많은 기사가 있습니다. Openterracotta 소개.

물론 다른 해결책이 있습니다. 그것은 대부분 당신이 여기서 달성하고자하는 것에 달려 있습니다. DB가 그렇지 않으므로 스케일링 해야하는 경우 동기화에 데이터베이스 잠금 장치를 사용하지 않습니다. 그러나 클러스터 동기화를 엉망으로 만드는 것은 지저분한 사업이기 때문에 기성품 솔루션을 찾도록 정말로 촉구합니다. :)

Memory-Data-Grid와 같은 것을 사용할 수 있습니다 http://www.hazelcast.com/ 이것도. 이것은 잠금을 지원하는 분산 데이터 구조입니다.

2 개의 기계에 대해 이야기하고 있기 때문에 메모리를 공유하지 않아서 동기화 할 것이 없습니다.

우리는 데이터베이스와 비슷한 일을합니다. 이것은 테이블에 레코드 버전을 추가하여 달성됩니다. 이것이 당신이해야 할 일입니다.

  1. 레코드/행 버전에 열을 추가하십시오.
  2. 로직을 통해 레코드를 업데이트 해야하는지 확인하십시오.
  3. 레코드를 업데이트 할 때 DB의 레코드 버전이 귀하가 가진 것과 동일해야합니다.
  4. 데이터베이스에 쓸 때마다 버전을 부딪칩니다.

이 규칙을 따르는 경우 하나의 서버가 데이터베이스를 업데이트해야합니다.

업데이트를 위해 단순히 테이블 (또는 전체 DB)을 잠글 수 없으므로 첫 번째 노드가 잠금을 얻었을 때 다른 모든 노드는 쓸 수 없습니다. 후속 노드가 대기하고 잠금이 해제되면 코드가 업데이트되므로 레코드 업데이트가 필요하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top