2015-12-08 180 views
1

我正在使用Spring構建的服務器上工作。 我們有一個非常簡單的查詢(獲得一種單一類型的所有實體),它在一定的記錄閾值(〜1,000,000)之後無法運行。在Google App Engine數據存儲上執行大型查詢

這是我嘗試的第一個方法(從谷歌文檔修改):

PersistenceManager pm = persistenceManagerFactory.getPersistenceManager(); 
List<T> Qresults; 
List<T> detachedList = new LinkedList<T>(); 
try { 
    Query query = pm.newQuery(cla); 
    query.setRange(0, 200); 
    List<T> results = (List<T>) query.execute(); 
    Cursor cursor = JDOCursorHelper.getCursor(results); 
    String cursorString = cursor.toWebSafeString(); 
    do { 
     cursor = Cursor.fromWebSafeString(cursorString); 
     Map<String, Object> extensionMap = new HashMap<String, Object>(); 
     extensionMap.put(JDOCursorHelper.CURSOR_EXTENSION, cursor); 
     query.setExtensions(extensionMap); 
     query.setRange(0, 200); 
     Qresults = (List<T>) query.execute(); 
     results.addAll(Qresults); 
    } while(Qresults.size() == 200); 

    for (T item : results) { 
     detachedList.add(pm.detachCopy(item)); 
    } 
    return detachedList; 
} finally { 
    pm.close(); 
} 

之後,我已經試過避免的PersistenceManager(我沒有任何經驗的春天或工作持久性):

JSONArray array = new JSONArray(); 
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
Query q = new Query("MobileDevice"); 
FetchOptions options = FetchOptions.Builder.withChunkSize(1000); 
PreparedQuery pq = datastore.prepare(q); 

for (Entity result : pq.asIterable(options)) { 
    array.put(new MobileDevice(result).toJSON()); 
} 
return new transactionResult(array.toString()); 

服務器在這兩種情況下都會引發超時異常。 我做錯了什麼?這種感覺應該是一個簡單的操作。

+0

我會建議分割你的結果並以小塊檢索它們...... –

回答

2

超時與請求執行時間有關,而與實體數量有關。如果您在自動縮放的App Engine實例上運行此查詢,則需要60秒才能完成請求。數據存儲查詢的可用時間也有限制 - 如果結果數量很大,則需要使用遊標。

顯而易見的解決方案不是將幾百萬條記錄作爲單個JSON對象返回,而是讓客戶端(或需要此數據的任何人)將它們置於可管理的區塊中,這些區塊只需不到60秒即可檢索。

+0

他已經在使用光標了。所以解決方法是將遊標字符串移動到請求參數和響應輸出,以供客戶端在下一個查詢中提供。不要傷害,指出更多... – konqi

+0

這聽起來像我所需要的 - 但(忘了提及這一點)我如何以一種RESTful的方式做到這一點?我是否需要序列化離開的點並將其發送給客戶端? – JohnnyBack

+1

@JohnnyBack cursor.toWebSafeString()是websafe(顯然)。您可以將其添加到您的回覆中。我通常爲我的響應創建一個Wrapper類,其中包含以下信息:動作是否成功,是否還有更多條目,什麼是遊標字符串,以及數據本身。 – konqi

相關問題