Почему я получаю исключение DeadlineExceededException: в моем веб-приложении?

#java #eclipse #google-app-engine #exception #servlets

#java #eclipse #google-app-engine #исключение #сервлеты

Вопрос:

Я использую Google App Engine. Раньше все работало нормально, но теперь, когда я вызываю сервлет, браузер занимает много времени, а затем показывает это:

  DeleteBooksServlet: com.google.apphosting.api.DeadlineExceededException: This request (0000000000000000) started at 2011/10/08 10:58:13.573 UTC and was still executing at 2011/10/08 10:59:13.036 UTC.
  

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

Раньше тот же сервлет работал нормально, но теперь я получаю это. Почему я получаю это сейчас? Заранее спасибо.

Комментарии:

1. Более 1 минуты? Вы удаляете> 10 миллионов книг или что-то в этом роде? Или вы удаляете с помощью a WHERE в неиндексированном столбце? Читайте дальше о том, как и когда правильно индексировать таблицы БД.

Ответ №1:

Потому что у вас, конечно, так много книг в базе данных, что запрос занимает много времени (более 1 минуты), и что GAE выдает это исключение, когда запрос такой длинный.

Смотрите http://code.google.com/intl/en-US/appengine/docs/java/runtime.html#Quotas_and_Limits

Ответ №2:

Удаление n книг занимает O (n) времени. Когда это время превысит лимит запроса, вам нужно ускорить эту операцию.

Очень хороший общий метод — разбить удаления на пакеты, где пакет может удалить, скажем, 100 книг). Затем используйте структуру очереди задач для планирования и запуска пакетов. Некоторые люди идут дальше и используют платформу MapReduce для управления пакетной обработкой.