如何在不等待完成的情况下调用存储过程?
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 中将多行连接成一行? [复制]