Запустите длительный sproc (который не нужно возвращать) со страницы ASP.NET - PullRequest
1 голос
/ 08 апреля 2010

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

Ответы [ 3 ]

2 голосов
/ 08 апреля 2010

Опция, ориентированная на базу данных:

  • Создайте таблицу, которая будет содержать список (или очередь) выполняемых заданий на длительный срок.
  • Приложите приложениедобавить запись в очередь, если, когда и по желанию.Это все, что он делает;После регистрации и ввода данные веб-сеанса или состояния не должны поддерживаться.
  • Настройте задание агента SQL для проверки каждые 1, 2, 5 в течение любых минут, чтобы увидеть, есть ли задания для запуска.
  • Если есть еще незапущенные элементы, пометьте самый последний как начатый и запустите его.
  • Когда он будет завершен, пометьте его как завершенный или просто удалите
  • Проверьте, есть ли другие пункты для запуска.Если есть, повторите;если нет, закройте задание.

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

(I 'Мы использовали этот метод для очень длительных методов. Это скорее трюк типа администратора, но он может подойти для вашей ситуации.)

1 голос
/ 08 апреля 2010

См. Асинхронное выполнение процедуры . Это единственный метод, который гарантирует выполнение даже в случае сбоя процесса ASP. Он также самонастраивается и может обрабатывать скачки нагрузки, запросы ставятся в очередь и обрабатываются по мере поступления ресурсов.

Суть решения заключается в использовании концепции Активация SQL Server , которая позволяет запускать хранимую процедуру в фоновом потоке в SQL Server без подключения клиента .

Решения, основанные на асинхронных методах SqlClient или на пуле потоков CLR, ненадежны, вызовы теряются при перезапуске процесса ASP и, кроме того, они создают очереди запросов в памяти, которые фактически инициируют перезапуск процесса из-за потребления памяти.

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

1 голос
/ 08 апреля 2010

Сначала подготовьте команду, затем поставьте ее в очередь в пуле потоков. Просто убедитесь, что поток не зависит от какого-либо HTTP-контекста или любого другого встроенного http-объекта. Если ваш запрос заканчивается до потока; контекст может исчезнуть.

...