我正在使用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());
服務器在這兩種情況下都會引發超時異常。 我做錯了什麼?這種感覺應該是一個簡單的操作。
我會建議分割你的結果並以小塊檢索它們...... –