2012-05-31 71 views
1

我需要優化我正在使用的POST請求的讀取/寫入計數。AppEngine - 優化POST請求的讀取/寫入計數

有關請求的某些信息:

  • 用戶發送的〜100項的JSON陣列
  • servlet需要檢查是否有任何所接收到的項的是然後其在數據存儲對方使用較新的單long屬性
  • 我使用JDO

我目前做的是(僞代碼):

foreach(item : json.items) { 
    storedItem = persistenceManager.getObjectById(item.key); 
    if(item.long > storedItem.long) { 
     // Update storedItem 
    } 
} 

這顯然會導致每個請求有100個讀取請求。

減少邏輯讀取次數的最佳方法是什麼?使用JDO Query?我讀了使用「IN」 - 查詢只是導致在多個查詢後執行另一個,所以我不認爲這會幫助我:(

還有PersistenceManager.getObjectsById(Collection)。這有幫助嗎?無法找到多少個請求的任何文件,這將發行。

回答

1

我認爲你可以使用下面的調用來完成一批得到:

Query q = pm.newQuery("select from " + Content.class.getName() + " where contentKey == :contentKeys"); 

喜歡的東西上面的查詢將返回你需要的所有對象。 你可以從這裏處理所有的休息。

+0

顯然,這不是你引用那裏的「低級API」 – DataNucleus

+0

剛剛檢查與appstats工具,這導致在一個datastored得到調用:) – Goddchen

+0

是的,我認爲@DataNucleus是對。我一直這麼想......謝謝指出。 –

0

最好的辦法是

pm.getObjectsById(ids); 

,因爲這是爲在呼叫獲得多個對象(尤其是因爲你的ID,因此鍵)。當然,當前的代碼(2.0.1和更高版本)應該爲getEntities()執行一個數據存儲區調用。請參閱this issue

+0

getObjectsById實際調用的是什麼?它是否執行批處理或是否爲每個ID執行getObjectById? – Goddchen

+0

「當然,當前的代碼(2.0.1和更高版本)應該爲getEntities()做單個數據存儲區調用」。很明顯,你可以很容易地閱讀日誌,以確認這樣的事情 – DataNucleus