2016-09-08 3 views
0

2 명 이상의 사용자가 여러 위치를 사용하여 상품을 내리려는 상황이 있지만 그 중 하나만 한 위치에서 언로드되고 다른 위치에서 대기 중인지 확인해야합니다 그가 끝날 때까지 (같은 위치에서 내려야한다는 명령을 받으면).다른 세션 사이에 문자열 arraylist 값을 공유

나는 arraylist occupiedLocations에 위치 이름을 저장하고 사용자가 위치를 입력 한 다음 위치 이름을 제거하기 전에 위치가 점유되어 있는지 확인한 다음 위치가 끝났을 때 위치 이름을 제거 할 것을 고려했지만 값은 문제입니다 arraylist 내부 다른 세션간에 공유되지 않습니다. 데이터베이스에 값을 저장할 수도 있지만 데이터베이스에서 쓰기/읽기가 필요없는 다른 옵션이 있습니다.

+0

무엇 세션? – assylias

+0

데이터베이스의 데이터를 캐시로로드 할 수 있습니다. DB에 저장하는 것은 그렇게 나쁘지 않으며 궁극적으로 데이터는 결국 거기에서 끝납니다. 읽기 시간을 단축하려면 적절한 색인을 사용하십시오. –

+0

목록과 일부 전역 개체를 동기화 메커니즘과 함께 사용하는 것이 좋습니다. '글로벌'은 환경에 따라 다릅니다. CDI가 사용 가능한 경우 응용 프로그램 범위 Bean이 될 수 있습니다. – Thomas

답변

0

클러스터 된 환경에서 동시 읽기가 실행되지 않도록 읽기/쓰기 잠금이있는 데이터베이스를 사용하는 것이 가장 좋습니다.

그러나 이것은 프로포절 솔루션입니다. 클러스터 된 실행이없는 작은 애플리케이션을 만들 계획이라면이 데이터를 포함하는 ServletContext 또는 Static 속성으로 충분할 것입니다. 이 데이터를 쓰거나 읽는 방법을 sychronized으로 지정하십시오.

아주 간단한 예 :

public static class MyApplicationSharedData { 
private static ArrayList<String> locations = new ArrayList(); 

private static synchronized void writeLocation(String location) { 
    locations.add(location); 
} 

public static void waitForLocation(String location) { 
    while (locations.contains(location)) { 
    try { 
     Thread.sleep(1000);// sleep for a second while the location is bussy 
    } catch (InterruptedException e) { 
     log.error(e); 
    } 
    } 
    writeLocation(location); 
} 

public static synchronized void freeLocation(String location) { 
    locations.remove(location); 
} 

}

사용 예제 :

MyApplicationSharedData.waitForLocation("Denver"); 
// Do stuff 
MyApplicationSharedData.freeLocation("Denver"); 
+0

별도의 수업에 모두 넣어 주면 효과가 있습니다. 고마워요. –

+0

교착 상태에주의하십시오. 이것은 아주 간단한 예제입니다. –

관련 문제