2012-03-24 2 views
1

문제가 있다는 것에 대해 감사드립니다.singelton 구현을 사용하는 Ejb 캐시

jboss, EJB 3.1 환경에서 작업하고 있습니다.

사용자가 특정 화면을 입력 할 때마다 데이터베이스에 저장된 데이터를 기반으로 트리 데이터 유형을 생성하기위한 트리거 여야합니다. 이 트리 계산에는 다소 시간이 걸릴 수 있으며 성능면에서 무거울 수 있습니다.

다음과 같은 요청은 UI에서 전송 :

1. refreshTree - a trigger for building the tree 
2. isTreeReady - indicating whether the tree is ready to use, and called every x amount of time 
3. getTree - return the tree. 

내가 여러 사용자가 동시에 해당 작업의 각 하나를 수행 할 수 있습니다 고려해야 할이 건물입니다.

나는 다음과 같은 캐시로 구현하는 방법에 대한 생각했습니다는 :

@singleton 
public class TreeCache{ 

@EJB 
MyTree tree; 

boolean isTreeReady = false; 

@Lock(LockType.WRITE) 
public void refresh(){ 
     isTreeReady = false; 
     tree = calulcateTree() \\ heavy calculation 
     isTreeReady = true; 
} 

public boolean isTreeReady(){ 
     return isTreeReady; 
} 

public MyTree getTree(){ 
     return tree; 
} 

}

내가 그와 함께이 문제 시나리오가있을 수 있다는 것입니다있는 :

  1. 첫 번째 사용자가 트리를 새로 고침 - 트리가 만들어졌습니다.
  2. 그런 다음 첫 번째 사용자가 트리 계산에 대해 알아 차리기 전에 두 번째 사용자가 트리를 작성하고 isReady 플래그를 false로 초기화합니다.이 경우 첫 번째 사용자는 계산이 완료 될 때까지 기다릴 필요가 있습니다 그는 나무를 사용할 수있었습니다).

나는 어떤 방법 (대신 isTreeReady 플래그)에서 읽기 잠금을 사용하여 시합을 생각하기 위해 노력하고있어,하지만 난 내 요구에 맞게 것이다 어떤 생각 할 수 없다.

내가 할 수있는 아이디어가 있습니까?

감사합니다.

+0

이 트리가 모든 사용자에게 동일합니까? 그렇지 않다면, 싱글 톤은 좋은 생각이 아닙니다. –

+0

그들이 동시에 물어 보면 그렇다, 그렇다. 화면이로드 된 후 트리가 새로 고쳐지지 않습니다 (계산하기가 무거움). 내가 뭘 더 사용할 수 있니? –

+0

트리를 계산 한 후 화면을 새로 고치지 않으면 모든 사용자가 같은 트리를 가져옵니다. –

답변

1

@Singleton 주석을 사용하면 컨테이너가 동시성을 관리합니다. 한 사용자가 메소드를 호출하면 모든 메소드가 쓰기 잠금을 갖습니다. 어떤 메소드에 대해서도 다른 사용자로부터의 요청은 이전 사용자가 리턴 할 때까지 기다려야합니다. &

그러나 refresh() 메소드에 명시 적으로 잠금을 적용 했으므로 다른 메소드 (isTreeReady(), getTree() 등)를 다른 사용자가 동시에 액세스 할 수 있습니다. 따라서 refresh() 메소드에서 잠금을 제거하면 한 번에 한 명의 사용자 만 메소드에 액세스 할 수 있습니다.

  • LockType.READ는 :이 방법은 동시에 많은 클라이언트와 액세스 또는 공유 할 수있는 경우 @Lock (LockType.READ)와 싱글의 비즈니스 또는 시간 제한 방식을 주석.

  • LockType.WRITE : 클라이언트가 해당 메서드를 호출하는 동안 단일 클라이언트 세션 Bean을 다른 클라이언트에 고정해야하는 경우 @Lock (LockType.WRITE)으로 비즈니스 또는 시간 제한 메서드에 주석을 첨부하십시오. 그렇지

, 당신은 싱글 톤 빈에 주석 @ConcurrencyManagement(ConcurrencyManagementType.BEAN)를 사용하여 bean 관리자의 동시성을 사용하여 더 나은 제어 할 수 있습니다.그러나 메소드 동기화, 동시성을 명시 적으로 관리해야합니다.

정확한 시나리오를 질문에서 파악할 수 없지만 적절한 잠금 전략을 사용하면 문제가 해결 될 수 있습니다.

관련 문제