我正在使用Spring构建的服务器上工作。 我们有一个非常简单的查询(获取单一类型的所有实体)在一定的记录阈值(~1,000,000)之后无法运行。
这是我尝试过的第一种方法(从Google文档中修改过):
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(我没有任何使用Spring或持久性的经验):
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秒的时间来检索。