2013-07-04 2 views
1

Мы начали получать много DatastoreTimeoutException в последнее время для этого основного запроса:DatastoreTimeoutException в приложении двигателя для основного запроса

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

В таблице есть приблиз. 1,5 млн. Юридических лиц. Это обычное поведение хранилища данных?

ОБНОВЛЕНИЕ: Если мы удалим фильтр, он работает лучше. Конечно, нам нужен фильтр, поэтому это не решение в долгосрочной перспективе.

+0

Неделя или 2 назад были проблемы с таймаутами данных. Вы все еще получаете эту проблему в последнее время? –

+0

Да, мы получаем это прямо сейчас. – Okku

+0

Это происходит в обычном веб-запросе? т. е. это 30-секундный предел ответа, который срабатывает? Если это клиентский запрос, возможно, имеют меньшие размеры выборки? (не решение, а другой вариант). Посмотрите, если вы получите тот же самый тайм-аут, если вы запустите запрос в задаче (у которой есть 10-минутный предел). –

ответ

0

Изменить использовать asIterator вместо asList.

От docs:

При переборе результатов запроса с использованием методов PreparedQuery.asIterable() и PreparedQuery.asIterator(), то хранилища данных извлекает результаты в пакетном режиме. По умолчанию каждая партия содержит 20 результатов, но вы можете изменить это значение, используя FetchOptions.chunkSize(). Вы можете продолжить итерацию по запросам до тех пор, пока все не будут возвращены или не будут выполнены тайм-ауты запроса.

Смежные вопросы