2011-11-17 3 views
3

에 뭔가를 넣어 한 후 데이터베이스를 조회 : 나는 데이터베이스에서 선택 아래AppEngine에 -이 같은 것을 할 권리 코드를 한 곳에서

FormModel(.. some data here..).put() 

그리고 몇 줄을 :

FormModel.all().filter(..).fetch(100) 

문제를 내가 알기 론 - 가져 오기가 방금 추가 한 데이터를 알지 못하는 경우가 있습니다.

나는 높은 복제 저장소를 사용하고 있기 때문에 이러한 상황이 발생한다는 것을 알았습니다. 데이터를 복제 할 충분한 시간을주지 못했습니다. 그러나이 문제를 어떻게 피할 수 있습니까?

답변

3

데이터가 동일한 엔티티 그룹에 속하지 않는 한 데이터가 데이터에 가장 적합 함을 보장 할 수있는 방법이 없습니다 (I understand this section).

+0

감사합니다. 이것은 이유처럼 보인다. – kolinko

+0

누군가가 신청/강제 적용을 기다릴 수있는 방법을 제공하는 경우를 대비하여 하루 동안 질문을 열어 두겠습니다. – kolinko

+0

@Merlin, 계속 열어 둡니다. 이것은 매우 무능한 질문이며, 저는 제가하지 않은 프로젝트를 가지고 있습니다. 이를위한 해결책이없는 한 HRD로 마이그레이션하고 싶습니다. –

2

Shay is right : 데이터 스토어에서 방금 입력 한 데이터를 반환 할 준비가 될 때를 알 수있는 방법이 없습니다.

그러나 put에 대한 호출이 성공적으로 완료되면 데이터가 결국 ,를 입력 할 것이라는 점을 보장입니다. 이는 많은 정보이며이 문제를 해결하기 위해이 정보를 사용할 수 있습니다. fetch에서 데이터를 다시 가져 오면 결국 엔 새로운 엔티티를 추가/삽입하십시오! 대부분의 경우, 요청에 따라이 작업을 수행하는 것이 충분할 것이라고 생각합니다. 그러나 memcache가 실패 할 경우를 제외하고 모든 요청을 처리하기 위해 memcache를 사용하는보다 강력한 작업을 수행 할 수 있습니다.

어려운 부분은 물론 엔티티를 추가/삽입해야하는시기입니다. 이 해결 방법을 수행해야한다는 것은 불쾌하지만 HRD만큼 놀라운 비용을 지불하는 비교적 저렴한 가격입니다.

+0

예, 이것은 "플랜 B"입니다 - 좀 더 간소화 된 솔루션을 선호합니다 :) – kolinko

+0

나는 이것이 현재 존재하는 최상의 솔루션이라고 생각합니다.나는 최근에'put' 엔티티를 쿼리에 포함시키기 위해 자동으로 스캔하고 결과를 얻는 라이브러리를 상상할 수 있습니다. 그러나 나는 그것을 들어 보지 못했습니다. –

0

https://developers.google.com/appengine/docs/java/datastore/transactions#Java_Isolation_and_consistency

에서이 일관적인 스냅 샷보기도에 후 읽어 내부 거래를 기록 확장합니다. 대부분의 데이터베이스와 달리 Datastore 트랜잭션 내에서 쿼리 및 을 가져 오면 해당 트랜잭션 내에 이전 의 결과가 표시되지 않습니다. 특히 엔터티가 으로 수정되거나 트랜잭션 내에서 삭제 된 경우 쿼리 또는 get은 트랜잭션의 시작 시점에서 엔터티의 원래 버전을 반환하고 엔터티가 존재하지 않으면 은 아무 것도 반환하지 않습니다.

관련 문제