Как вызвать хранимую процедуру, не дожидаясь ее завершения? - PullRequest
2 голосов
/ 22 декабря 2009

Как вызвать хранимую процедуру из метода веб-службы, не дожидаясь завершения хранимой процедуры, и просто оставив метод завершить все остальные действия?

В качестве примера (не фактическая ситуация, но гораздо проще для понимания): У меня есть столовые дома с 10 миллионами рядов, и каждый год я должен рассчитывать, сколько стоит каждый дом, основываясь на почве, конструкциях и т. Д.

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

Итак, как бы мне избежать тайм-аута и позволить моему веб-приложению продолжать делать другие вещи.

спасибо.

Ответы [ 5 ]

8 голосов
/ 22 декабря 2009

Если вы не зависите от результатов хранимой процедуры, вы можете заключить вызов хранимой процедуры в метод и вызвать его с помощью

        Thread statisticsThread = new Thread(new ThreadStart(YourSPWrapper));
        statisticsThread.Priority = ThreadPriority.Lowest;
        statisticsThread.Start();
2 голосов
/ 22 декабря 2009

Вы говорите о вызове SP, который ничего не возвращает? Как начать работу на сервере?

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

ThreadPool.QueueUserWorkItem(myDelegateFunction);

protected void myDelegateFunction(object state) {
   //make your db call here and let the delegate fall out of scope
   //if you need to set a variable saying it succeeded, set a global here
}

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

1 голос
/ 22 декабря 2009

В IBM Informix Dynamic Server 11 вы можете рассмотреть возможность запуска процедуры через планировщик задач DB-Cron. Программа инициирует операцию как синхронный запрос к базе данных, но задачу не нужно будет завершать до завершения запроса.

1 голос
/ 22 декабря 2009

Возможно, рассмотрите возможность использования агента SQL Server для планирования запроса в качестве задания? Это особенно полезно, если работа должна выполняться по регулярному расписанию или только очень редко.

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

0 голосов
/ 14 марта 2012

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

http://msdn.microsoft.com/en-us/library/ms345108(v=sql.90).aspx#sqlsvcbr_topic6 http://blog.sqlauthority.com/2009/09/21/sql-server-intorduction-to-service-broker-and-sample-script/

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