문제가 있다는 것에 대해 감사드립니다.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;
}
}
내가 그와 함께이 문제 시나리오가있을 수 있다는 것입니다있는 :
- 첫 번째 사용자가 트리를 새로 고침 - 트리가 만들어졌습니다.
- 그런 다음 첫 번째 사용자가 트리 계산에 대해 알아 차리기 전에 두 번째 사용자가 트리를 작성하고 isReady 플래그를 false로 초기화합니다.이 경우 첫 번째 사용자는 계산이 완료 될 때까지 기다릴 필요가 있습니다 그는 나무를 사용할 수있었습니다).
나는 어떤 방법 (대신 isTreeReady 플래그)에서 읽기 잠금을 사용하여 시합을 생각하기 위해 노력하고있어,하지만 난 내 요구에 맞게 것이다 어떤 생각 할 수 없다.
내가 할 수있는 아이디어가 있습니까?
감사합니다.
이 트리가 모든 사용자에게 동일합니까? 그렇지 않다면, 싱글 톤은 좋은 생각이 아닙니다. –
그들이 동시에 물어 보면 그렇다, 그렇다. 화면이로드 된 후 트리가 새로 고쳐지지 않습니다 (계산하기가 무거움). 내가 뭘 더 사용할 수 있니? –
트리를 계산 한 후 화면을 새로 고치지 않으면 모든 사용자가 같은 트리를 가져옵니다. –