如何在不等待完成的情况下调用存储过程?

Posted

技术标签:

【中文标题】如何在不等待完成的情况下调用存储过程?【英文标题】:How to call a stored procedure without waiting for it to finish? 【发布时间】:2009-12-22 06:45:37 【问题描述】:

如何从 Web 服务方法调用存储过程,而不必等待存储过程完成,而让该方法完成所有其他活动?

作为一个例子(不是实际情况,但更容易理解): 我有一个一千万排的桌子房子,每年我都要根据土壤、建筑等计算每间房子的价值。

在年底之前,我输入新的土壤和建筑参数,然后让数据库计算每栋房屋的价值(使用从 Web 服务方法调用的存储过程),但这可能需要几个小时。在同样的方法中,我希望能够告诉系统我已经开始计算(在它开始之后,而不是之前)。

那么在这里我将如何避免超时,并让我的网络应用继续做其他事情。

谢谢。

【问题讨论】:

【参考方案1】:

如果你不依赖于存储过程的结果,你可以将你的存储过程调用包装在一个方法中,并使用它来调用它

        Thread statisticsThread = new Thread(new ThreadStart(YourSPWrapper));
        statisticsThread.Priority = ThreadPriority.Lowest;
        statisticsThread.Start();

【讨论】:

【参考方案2】:

你是说调用一个什么都不返回的 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

然后,您可以随时启动委托,当有可用的线程资源时,它将在异步委托中执行。

【讨论】:

【参考方案3】:

也许考虑使用 SQL Server 代理将查询安排为作业? 如果作业需要定期运行或很少运行,这尤其值得。

如果绝对必要,您还可以使用 SQL 脚本从您的 web 应用程序按需安排作业。只需确保代理服务正在运行,否则您的作业将无法启动。

【讨论】:

【参考方案4】:

使用 IBM Informix Dynamic Server 11,您可以考虑通过 DB-Cron 任务调度程序运行该过程。程序会以同步数据库请求的形式启动该操作,但该任务不需要在请求完成之前完成。

【讨论】:

这是我遇到的另一个不相关的问题,我正在使用服务器工作室,作业由哨兵处理,我想使用 informix 而不是第三方应用程序处理作业,是计划任务informix 数据库的一部分还是操作系统的一部分(我使用 hp-ux)?谢谢 借助 IDS 11(11.10、11.50),您可以仅使用 Informix 来安排作业。【参考方案5】:

我发现的另一个解决方案涉及 sql server 代理,这对于一个简单的问题可能有点矫枉过正,但它可以派上用场

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/

【讨论】:

以上是关于如何在不等待完成的情况下调用存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

在不创建存储过程的情况下,如何在 Oracle 中将多行连接成一行? [复制]

等待批量插入存储过程完成

在不使用存储过程的情况下循环 n 次

如何在不知道查询结果类型的情况下在 EF/VB.net 中运行存储过程?

如何在不使用存储过程的情况下在表函数中返回值 exec?

mysql存储过程出现锁表锁行的情况怎么解决