2010-07-20 3 views
3

Я только что протестировал и перераспределил свое приложение на тестовый экземпляр, и он работал нормально, затем я изменил идентификатор приложения и перераспределил его на экземпляр моего производства, и у меня возникла проблема с индексацией. Как мне избежать этого в будущем? Я приложил все усилия, чтобы проверить его, и все получилось отлично!Почему я получаю это исключение в GAE

Uncaught exception from servlet 
com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found..  <datastore-index kind="Article" ancestor="false" source="manual"> 
    <property name="tags" direction="asc"/> 
    <property name="created" direction="asc"/> 
</datastore-index> 
at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:40) 
at com.google.appengine.api.datastore.DatastoreApiHelper.makeSyncCall(DatastoreApiHelper.java:67) 

Консоль администратора сообщает, что это «Создание» индекса. Он сказал, что уже 20 минут! Сколько времени это занимает!?

ответ

10

При создании новых запросов, и использовать их в первый раз на локальном компьютере, они всегда работают в первый раз. Когда вы впервые запускаете эти новые запросы в движке Google, они возвратят это исключение, потому что серверу движка Google потребуется некоторое время, чтобы создать «индекс», чтобы ваш запрос работал правильно.

Я бы рекомендовал, когда вы создаете новые запросы, чтобы дать им один раз в рабочей среде, чтобы получить «индекс», так что, когда ваши пользователи ударяют их, они работают в первый раз.

Во-вторых, вручную предварительно определяя свои запросы перед их использованием и выгружая их на сервер, означает, что, когда они вам действительно понадобятся, они могут быть созданы на сервере уже.

+0

Индексы построены, когда файл определения индекса, порожденное SDK, загружается на сервер. В отличие от SDK, производственная среда автоматически не создает индексы при выполнении запросов. –

+3

Я решил это, добавив индексы tot WEB-INF/datastore-indexes.xml, как указано здесь: http://dnhome.wordpress.com/2011/10/07/google-apps-engine-write-first-queries- to-get-entity-from-datastore/GAE предлагает запись для него, которая в моем случае была правильной. – Herbert

1

Проверьте файл index.yaml и убедитесь, что соответствующие показатели указаны там, и т.д.

5

То, как я работаю над этой проблемой, - это поддерживать несколько версий для моего приложения. Обычно что-то вроде этого:

  • Version 1: Current По умолчанию
  • Version 2: Следующий релиз

Когда у меня есть новый релиз, готовый к развертыванию, я загрузить его на версия 2 в этом случае. Как только индексы были построены, я делаю версии 2 по умолчанию. Таким образом, клиенты никогда не испытывают простоя или ошибок.

Таким образом, вы можете поменять местами между версиями 1 и 2 при выпуске новой версии.

Я бы предположил, что перед отправкой в ​​развернутое «Приложение» вы также проводите предварительную проверку в рамках другого «Приложения» тестирования.

+0

У меня такое же поведение: у меня есть «бета-версия», в которой я развертываю новые разработчики и строю все нужные индексы, прежде чем загружать их в «prod». Мне не нужен «переключатель», хотя индексы разделяются. – Sebastien

2

Это происходит из-за того, что индексы хранилища данных приложения не инициализируются, т. Е. Ответ corydoras правильный. Я добавляю свое исправление для java [я предполагаю, что python и index.yaml имеют аналогичное исправление].

Вы можете увидеть, какие индексы используются на вашем аккаунте Google на https://appengine.google.com/. нажмите ссылку на приложение слева и в левом меню выберите «Данные хранилища данных» под данными

Когда вы делаете новый запрос к хранилищу данных, для обновления индексов данных может потребоваться несколько часов.

Прежде всего вы должны знать, что отладка в локальной среде создает файл с именем datastore-indexes-auto-xml каждый раз, когда сохраняется новый «вид» сущности.

В локальной среде он может быть использован мгновенно для запроса, но есть задержка в обновлении индекса данных-auto-xml.

При развертывании приложения в appengine отправляется автоматически созданный индекс хранилища данных-auto-xml, а индексы данных обновляются намного быстрее [для просмотра результатов обновления страницы].

Так

  1. не Убедитесь, что ни один из ваших лиц имеют незаконные знаки, например, '&'.
  2. Откройте представление «Индексы данных» на странице appengine.google.com.
  3. Убедитесь, что вы не удалили индекс хранилища-auto-xml. [Я делаю это регулярно]
  4. Хранить сущность каждого «Доброго»!
  5. Используйте все «Виды» в запросах!
  6. Удостоверьтесь, что обновлен datastore-indexes-auto-xml [Иногда я даже перезапускаю затмение]
  7. Развертывание для установки.
  8. Обновить данные Индексный указатель в браузере.
  9. Подождите, пока не увидите указатели enter image description here
  10. Сообщите об этом Google.
  11. Это был информативным, но не работает для меня: enter link description here
  12. Это также было информативным, но не работает для меня: enter link description here
Смежные вопросы