2012-01-05 48 views
2

我是App Engine的新手,寫了一個示例應用程序。如果我創建或更新實體:如何避免GoogleAppEngine DataStore延遲?

Entity record = new Entity(...); 
... set properties 
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
datastore.put(record); 

,然後重定向到執行下面的代碼,其中新的或更新的實體顯示

resp.sendRedirect("MainPage.jsp"); 

DatastoreService datastore = 
DatastoreServiceFactory.getDatastoreService(); 
Query query = new Query(...).addSort(..., Query.SortDirection.DESCENDING); 
List<Entity> entities = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(20)); 

的新記錄不在列表中。頁面被更新(如顯示的時間戳所示),但是當我刷新頁面時,僅在延遲幾秒鐘之後才顯示新記錄或現有記錄的修改。

這怎麼可以避免? DataStore可能不適合這樣的事情嗎?

我使用Eclipse的本地測試環境從GAE與Windows XP 64

+0

https://developers.google.com/appengine/docs/java/datastore/structuring_for_strong_consistency – 2014-07-08 00:06:28

回答

8

是的,這叫做"eventual consistency",它是HRD的默認更新模型(現在是所有新實例的默認更新模型)。

因此,放置一個實體然後查詢它可能不會返回(事件一致性),但放置它然後獲取它(通過一個鍵)(get通過一個鍵)將立即返回(強一致性)。

解決方法是,:

  1. 採用主從數據存儲,或
  2. 如果可能的話,重寫代碼來使用,而不是get查詢。

此外,本地開發服務器僅用於測試,並不像生產實例那樣運行,所以您應該始終(最終)對生產進行測試。

+0

我不會推薦使用Master Slave數據存儲。爲了克服「最終一致性」,有一些提示,關於通過密鑰獲取實體是其中之一,另一種是使用實體組對數據建模。由於父母的查詢應返回強一致性結果。 – 2012-01-06 16:34:34

-1

既然你在GAE上運行,你最好的選擇是使用其Memcache短期檢索(你仍然需要把東西在DataStore中進行持久化)。

+0

請記住,memcache並不保證能夠返回任何內容,因此您與「最終一致性」的內容大致相同HR數據存儲。 – 2012-01-05 21:17:51

相關問題