长时间运行的存储过程超出了IIS进程

3
我有一个长时间运行的存储过程,从旧系统中导入许多记录,需要数小时才能执行完。当执行时,可能需要回收IIS进程或重新启动Web服务器或其他导致IIS进程结束并相应地终止存储过程的操作。
我决定在一个脱机环境中使用w3wp.exe进程来运行存储过程。
解决方案:
  • 服务代理激活:我阅读了这篇文章,但它很复杂,诊断服务队列很困难
  • 在Windows服务下运行:
  • 定义SQL Server作业:它需要SQLAgentReaderRole角色权限,并且我需要向存储过程传递参数
还有其他解决方案吗?

那么,从 Web 应用程序调用的控制台应用程序呢?这是一个非常简单的解决方案,您可以传递参数并且它可以运行数小时。 - Jesús López
Windows服务比控制台应用程序更好,但两者都不能在重新启动服务器时自动运行。服务代理解决方案支持此功能。 - Mohammadreza
我使用过 https://www.hangfire.io/,它在这种情况下运行良好。 - JimG
2个回答

0
CLR程序集。
将您的代码更改为类库,并将类库的dll结果导入为SSMS的程序集函数,使用以下代码。
CREATE ASSEMBLY myAssembly from 'E:\Projects\CL.dll'

现在你可以放心地调用它,而不必担心IIS停止。

如果重新启动 Web 服务器,它还需要再次调用 sp。我认为最佳实践是第一种解决方案,即 SQL Service Broker。 - Mohammadreza
我问的是存储过程,而不是 .net 代码。此外,我更喜欢使用纯 SQL Server 的功能和能力,而不是 CLR 程序集,因为它更易于维护,而且我不确定 CLR 程序集的性能如何。 - Mohammadreza

0

我个人更喜欢使用 Windows 服务。最近我在使用自托管WebApi,这使得我可以从 MVC 中启动长时间运行的任务(使用 HttpClient 或 System.Net.HttpWebRequest等)。


如果重新启动 Web 服务器,它还需要再次调用 sp,并注册 Windows 服务。我认为最佳实践是使用第一种解决方案,即 SQL Service Broker。 - Mohammadreza
而且 Windows 服务即使什么都不做也会消耗资源。 - Mohammadreza
这些都是有道理的观点。我不会仅为了这一个目的而使用服务,除非它还可以执行其他任务,以便资源消耗可以得到合理的解释。但是,服务可以轻松处理在重新启动时执行您的存储过程。 - JimG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接