#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 для управления пакетной обработкой.