Веб-страница зависает после завершения выполнения процедуры - PullRequest
2 голосов
/ 31 декабря 2011

У меня есть веб-страница, которая принимает файл Excel, считывает данные из него и сохраняет его в буферной таблице. Затем вызывается процедура, которая читает из этой буферной таблицы, и каждая запись проходит через количество проверок. После завершения процедуры я удаляю содержимое буферной таблицы из кода позади. Я выполнил этот код, используя около 100 записей, и он выполняется за несколько секунд. Однако когда размер записи увеличивается (скажем, около 2000), процедура занимает более 5 минут, но веб-страница зависает. Я проверил таблицу, вставка записей и удаление буферной таблицы занимает около 6-7 минут, но веб-страница не возвращает результат даже через 30 минут. Я попытался оптимизировать процедуру, но все же в случае большого количества записей веб-страница зависает.

Пожалуйста, дайте мне какое-нибудь указание о том, как избежать этой ситуации зависания страницы. Любая помощь будет отличной. Заранее спасибо

1 Ответ

2 голосов
/ 31 декабря 2011

Я думаю, что первое, что вы должны сделать, это включить ваши вставки в транзакцию.

Если для одной транзакции слишком много записей, вы можете выполнять фиксацию каждые n записей (скажем, 500).

Что касается возврата веб-страницы, возможно, вы достигли некоторого времени ожидания, когда IIS или клиент отклоняет запрос, или если вы обновляете страницу данными, у вас могут быть недействительные данные, которые вызывают ошибки на странице.

Для этого вам следует проверить журнал событий Windows, чтобы узнать, сообщают ли IIS или ASP.Net о каких-либо исключениях. Вы также можете запустить fiddler , чтобы увидеть, что происходит с запросом.

Наконец, я настоятельно рекомендую изменить дизайн, который не требует от пользователя ожидания с отправленной формой на экране до завершения обработки.

Стандартный шаблон, который мы используем для этого типа функциональности, состоит в том, чтобы записывать входящие запросы в базу данных с GUID, запускать фонового работника для выполнения задачи и возвращать GUID клиенту.

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

Клиент может использовать GUID для регулярной отправки ajax-запросов на веб-сервер (используя window.timeout, чтобы не блокировать пользователя и не отображать анимацию), чтобы определить, завершен ли процесс. После завершения процесса пользовательский интерфейс может быть обновлен по мере необходимости.

Обновление

Для записи входящих запросов в базу данных с идентификатором GUID создайте таблицу, содержащую столбец GUID в качестве первичного ключа, столбец состояния (3 значения: выполняется, успешно, отказ) и столбец сообщения об ошибке.

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

Вы передадите GUID фоновому работнику, чтобы он мог обновить таблицу по завершении (он просто обновляет этот статус для завершения или для ошибки и записывает сообщение об ошибке, если таковое имеется).

Вы также передадите GUID обратно клиенту через javascript, чтобы клиент мог периодически просить веб-сервер выполнить запрос к таблице, используя GUID, чтобы определить, когда запрос больше не выполняется.

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