2013-07-04 37 views
1

我們已經開始得到了很多DatastoreTimeoutException的最近這個基本的查詢:DatastoreTimeoutException App Engine中的基本查詢

select id from Later where at < '2013-07-04' limit 500 (Some Pseudo SQL) 

在代碼中,它看起來像:

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)); 

表有aprox的。 150萬個實體。這是正常的數據存儲行爲嗎?

更新:如果我們刪除過濾器,它會更好地工作。當然,我們需要過濾器,因此長遠來看這不是一個解決方案。

+0

一個星期或2個星期前,數據存儲區超時有問題。你最近是否仍然遇到這個問題? –

+0

是的,我們現在正在製作它。 – Okku

+0

這是否發生在正常的Web請求中?即是否正在踢入30秒的響應限制?如果這是一個面向客戶的請求,也許可以做更小的獲取大小? (不是解決方案,而是另一種選擇)。如果您在任務中運行查詢(具有10分鐘的限制),請查看是否獲得相同的超時時間。 –

回答

0

更改爲使用asIterator而不是asList

docs

當通過查詢的結果使用 PreparedQuery.asIterable()和PreparedQuery.asIterator()方法迭代,所述數據存儲 檢索分批結果。默認情況下,每個批次 都包含20個結果,但您可以使用 FetchOptions.chunkSize()更改此值。您可以繼續遍歷查詢 結果,直到返回全部或請求超時。

相關問題