Google app engine 用于基本查询的应用程序引擎中的DatastoreTimeoutException

Google app engine 用于基本查询的应用程序引擎中的DatastoreTimeoutException,google-app-engine,timeout,google-cloud-datastore,Google App Engine,Timeout,Google Cloud Datastore,对于这个基本查询,我们最近开始收到很多DatastoreTimeoutException: select id from Later where at < '2013-07-04' limit 500 (Some Pseudo SQL) 这张桌子有围裙。150万个实体。这是正常的数据存储行为吗 更新:如果我们删除过滤器,它会工作得更好。当然,我们需要过滤器,所以从长远来看,这不是一个解决方案。改为使用asIterator而不是asList 从: 当使用 PreparedQuery.asI

对于这个基本查询,我们最近开始收到很多DatastoreTimeoutException:

select id from Later where at < '2013-07-04' limit 500 (Some Pseudo SQL)
这张桌子有围裙。150万个实体。这是正常的数据存储行为吗


更新:如果我们删除过滤器,它会工作得更好。当然,我们需要过滤器,所以从长远来看,这不是一个解决方案。

改为使用
asIterator
而不是
asList

从:

当使用 PreparedQuery.asIterable()和PreparedQuery.asIterator()方法 数据存储分批检索结果。默认情况下,每个批次 包含20个结果,但您可以使用 FetchOptions.chunkSize()。您可以继续遍历查询 结果,直到全部返回或请求超时


一两周前,数据存储超时出现问题。你最近还收到这个问题吗?是的,我们现在正在收到。这是在正常的web请求中发生的吗?i、 是不是30秒的响应限制开始生效了?如果这是一个面向客户机的请求,可能会执行较小的获取大小?(不是解决方案,而是另一种选择)。查看如果在任务中运行查询(有10分钟的限制),是否会得到相同的超时。任务中不会发生这种情况,并且超时异常会在60秒后抛出。
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();

    Query query = new Query("Later").setKeysOnly();
    Filter f = new FilterPredicate("at",FilterOperator.LESS_THAN, new Date());
    query.setFilter(f);
    query.addSort("at", SortDirection.DESCENDING);

    PreparedQuery pq = datastore.prepare(query);
    return pq.asList(FetchOptions.Builder.withLimit(500));