2013-04-10 108 views
0

我發現我的GAE數據存儲實驗有些奇怪。我正在使用GAE SDK 1.7.5。 我不確定我的發現是否正確。實體數量不會更新,直到實體獲取

基本上,我發現將實體放入數據存儲區並進行計數不會返回正確的值,直到Datastore get執行爲止。

如果你想更深入的在這裏挖是從我以前的SO問題的實際代碼:

Persistence strategies for High Replication environment (Google App Engine)

我也試圖與一個類似的庫:https://github.com/koher/Koherent-App-Engine-Library-for-Java

而且我遇到同樣的發現。任何人都可以幫助澄清我看到的這個問題?

回答

0

您遇到了HRD的最終一致性屬性。

Count使用索引來獲得結果。保存新實體後,索引將異步構建,導致put之後的get將始終返回結果(強一致性),但put之後的query不保證立即返回結果(最終一致性)。

該文檔在這個主題上有點模糊,但它確實提到put之後的get強制「應用」階段,可能導致索引也被應用:請參見第1節「返回值」部分。 Life Of The Datastore Write

所以put然後query不能保證得到預期的結果,但是putgetquery是(至少這是我如何閱讀文檔)。這將解釋你的發現。

+0

得到後,強制「應用」 - >這似乎回答我的問題,所以當應用程序調用get時,查詢可能會得到我正在經歷的實際值。 – xybrek 2013-05-04 17:25:24

2

我假設你在本地開發服務器上啓用了最終一致性的結果?

由於數據存儲的最終一致性行爲,您沒有得到正確的計數。它就是這樣兒的。

在開發服務器上,像get()這樣的一致操作會導致後續查詢顯示一致的結果。這與生產服務器的行爲不完全相同。