4

내 서블릿이 다음을 수행해야합니다. 사용자가 장소에 등록 할 때 해당 사용자가 현재 위치가 어딘 곳에서도 등록되어 있는지 확인합니다 (등록 취소 한 경우). 그를 다시 등록하기.

나는이 내 문제를 보여주기 위해 단순화 한 다음 코드 :Objectify가 동 기적으로 저장하지 않습니다.

Date tempDate = new Date(); 


    Visit v = ofy().load().type(Visit.class) 
      .filter(Visit.USER_ID, 5L) 
      .filter(Visit.EXIT_DATE, null).first().get(); 

    if(v != null) 
     exitVenue(5L, 7L, tempDate); 

    Visit visit = new Visit(5L, 7L, tempDate);  
    ofy().save().entity(visit).now(); 

    Date tempDate2 = new Date(); 


    Visit v2 = ofy().load().type(Visit.class) 
      .filter(Visit.USER_ID, 5L) 
      .filter(Visit.EXIT_DATE, null).first().get(); 

    if(v2 != null) 
     exitVenue(5L, 7L, tempDate2); 

    Visit visit2 = new Visit(5L, 7L, tempDate2);   
    ofy().save().entity(visit2).now(); 
} 


public void exitVenue(Long userID, Long venueID, Date exitDate) { 

    Visit visit = ofy().load().type(Visit.class) 
      .filter(Visit.USER_ID, userID) 
      .filter(Visit.VENUE_ID, venueID) 
      .filter(Visit.EXIT_DATE, null).first().get(); 

    if(visit == null){ 
     log.info("ERROR : User " + userID + " exited venue " + venueID + ", but Visit was not found"); 
     return; 
    } 
    visit.setExitDate(exitDate); 

    ofy().save().entity(visit).now(); 
} 

문제는 내가 두 번째 시간이 모든 작업을 미리 형성 할 때, 그것은 항상 있다는 것을 발견 한 것입니다 이미 데이터 저장소에 방문 (두 번째 테스트마다). 그리고 나는 혼란 스럽다. 'now()'가 바로 그것을 저장하고 계속 실행하는 것을 가정하지 않는가? 당신이 엔티티를 생성/업데이트 할 때,이 방법은 즉시 반환하지만 indexes are still being built asynchronously :


, 당신의 도움을 당신에게 댄

+0

디버그 도구로 이것을 실행하면 모든 것이 잘 동작합니다. 그것이 내가 속도의 문제라고 생각한 이유입니다. – RCB

답변

12

GAE 데이터 저장소가 eventually consistent이기 때문에 이런 일을 대단히 감사합니다. 쿼리가 인덱스에 의존하기 때문에 변경 사항을 즉시 볼 수 없습니다.

또한 objectify와 관련이 없습니다. 이는 기본 데이터 스토어의 속성입니다. 동기 쓰기 (.now())는 커밋 단계이 완료 될 때까지 기다리고 비동기는 그 직전에 즉시 반환됩니다.

+0

답변 해 주셔서 감사합니다. 두 가지 질문이 있습니다. 1. 거래를 가속화하기 위해이 작업을 수행 할 수있는 방법이 있습니까? 아니면 앱을 디자인 할 때 고려해야 할 사항입니까? 2. 이전에 GAE와 JPA에서 일했던 적이 있었지만이 사실을 전혀 알지 못했습니까? – RCB

+1

저장 호출에서 돌아 오기 전에 인덱스를 저장 한 마스터/슬레이브 데이터 저장소 (사용 가능하지 않음)를 사용하지 않는 한 왜 JPA를 사용하지 않았는지 잘 모르겠습니다. 이 동작을 변경하기 위해 할 수있는 일은 없으며 작동 방식을 고려해야합니다. – mjaggard

+0

다음 번에 읽이 실행될 때 엔티티 변경 사항이 적용됩니다 (= 인덱스가 쓰여집니다) : https://developers.google.com/appengine/articles/life_of_write. 어쩌면 당신은 쓰기 후에 읽음을 시도해야한다. –

관련 문제