2011-05-09 4 views
0

내 상황은 다음과 같습니다.
내 테이블에 Session 목록이 있습니다.
데이터 스토어의 마지막 세션에 조건부 플레이어가 있는지 확인하는 코드를 작성합니다.
새 세션을 만들지 않으면.AppEngine 개체 지연을 유지 하시겠습니까?

public Session getEligeableSession(){ 
    Session session; 
    session = ds.getLastSession(); 
    if(session.numPlayers > 3){ 
     newSession(); 
     session = ds.getLastSession(); 
    } 
    return session; 
} 

이 지역에 완벽하게 작동하지만 AppEngine에의 AppSpot에하지 ​​않습니다 :

그것은이 같은 작은 선물을 간다.
AppSpot에서 나는 채워진 세션을 다시 얻는다. 내 코드가 새로운 세션이 완전히 지속될 때까지 기다리지 않고 단지 이전 세션을 다시 얻는다는 결론을 내려야한다.

내 결론이 옳습니까? 그렇다면 어떻게하면이 자비로 해결할 수 있을까요?
'지연'을 검색하면 Google/SO에 아무런 결과가 없기 때문에 그러한 일이 없다고 생각됩니다 (동기식). 내 코드에 다른 실패가 있습니다. (아마도 목록에서 마지막 개체를 가져 오는 것입니다 AppEngine에서 다르게 작동 함)

모든 도움/조언을 보내 주시면 감사하겠습니다.

요약 :

세션 (Object)를 가지고 (목록) 4 명 선수 (Object)를
getLastSession() 마지막 하나를 데이터 저장소에서 전체 목록을 검색하고 얻을 ( 크기-1).
newSession()은 새 Session 객체를 만들고 유지합니다. 요청에 따라

편집 :

public List<Session> getAll(){ 
    pm = PMF.get().getPersistenceManager(); 
    String query = "select from " + Session.class.getName(); 
    @SuppressWarnings("unchecked") 
    List<Session> sessions = (List<Session>) pm.newQuery(query).execute(); 
    return sessions; 
} 


public Session getLastSession(){ 
    List<Session> sessions = getAll(); 
    Session session = sessions.get(sessions.size()-1); 
    session.activeGame = session.numPlayers == 4 ? true : false; 
    pm.close(); 
    return session; 
} 


    public int insert(Session session){ 
    pm = PMF.get().getPersistenceManager(); 
    int status = 0; 
    try { 
     pm.makePersistent(session); 
    } finally { 
     pm.close(); 
    } 
    return status; 
} 

코드는 '합리적인'보인다는 더 재미있는 물건 AFAIK 일이 없습니다. master-slave 옵션을 사용하고 있습니다.

+0

이 newSession의 구현 기능 및 getLastSession? 여기에 실제 코드가 중요합니다! 그리고 높은 복제 데이터 저장소를 사용하고 있습니까? –

+0

@Nick Johnson 요청한대로 내 게시물을 업데이트했습니다. 잊어 버린 : NewSession 그냥 삽입 (새 세션)입니다; – Rohan

+0

하나의 영속성 관리자를 각 기능에 새로 추가하지 않고 모든 기능에 전달하려고 했습니까? –

답변

1

당신이 당신의 메소드를 어떻게 구현했는지 모르겠으니까요,하지만 두 개의 서로 다른 서블릿 (하나는 객체를 저장하고 하나는 그것을 검색)에 두 개의 다른 인스턴스 인 PersistenceManager을 사용한다면, 데이터 저장소 서버 전체에 데이터를 복제 할 충분한 시간을주지 않고 즉시 두 개의 다른 서버에 차례로 액세스 할 수 있습니다. (방법 newSession(); 작품에 따라이되지 않을 수도 있습니다,하지만 사건을)

다른 설명이 스레드의 첫 번째 답변에서 또한보세요 :

http://groups.google.com/group/google-appengine/browse_thread/thread/2b4f6ec57031f53c/fc967c034e4a113f

관련 문제