从ASP.NET页面运行长时间运行的sproc(不需要返回)

时间:2010-04-07 20:42:14

标签: sql-server-2000 asp.net-2.0

我想知道如何从页面运行存储过程,即使页面关闭也只是“让它完成”。它不需要返回任何数据。

3 个答案:

答案 0 :(得分:2)

以数据库为中心的选项是:

  • 创建一个表,其中包含要执行的长时间运行作业的列表(或队列)。
  • 让应用程序根据需要添加条目到队列中。这就是它的全部;记录并输入后,不需要维护Web会话或状态数据。
  • 将SQL代理作业配置为检查每1,2,5分钟,以查看是否有任何要运行的作业。
  • 如果还有尚未启动的项目,请将最新项目标记为已启动,然后启动它。
  • 完成后,将其标记为已完成,或者只是将其删除
  • 检查是否还有其他项目要运行。如果有,重复;如果没有,退出工作。

根据容量,您可以运行此作业的多个(命名不同的)副本,同时处理列表中的项目。

(我已经将这种方法用于非常长时间运行的方法。它更像是一种管理类型的技巧,但它可能适合你的情况。)

答案 1 :(得分:1)

首先准备命令,然后在线程池中排队。只需确保该线程不依赖于任何HTTP上下文或任何其他http内部对象。如果您的请求在线程之前完成;背景可能已经消失。

答案 2 :(得分:1)

Asynchronous procedure execution。即使ASP进程崩溃,这也是唯一可以保证执行的方法。它还可以自我调整,可以处理负载峰值,请求排队并在资源可用时进行处理。

解决方案的要点是利用SQL Server Activation概念,它允许您在SQL Server 中的后台线程中运行存储过程而无需客户端连接

基于SqlClient异步方法或CLR线程池的解决方案是不可靠的,随着ASP进程被回收,调用会丢失,而且它们会构建内存中的请求队列,这些队列实际上会因内存消耗而触发进程回收。

基于表和代理作业的解决方案更好,因为它们可靠,但它们缺乏基于激活的解决方案的自我调整。