【问题标题】:Long-running stored procedure out of IIS processIIS 进程外的长时间运行的存储过程
【发布时间】:2016-02-27 05:39:03
【问题描述】:

我有一个长时间运行的存储过程,它从旧系统导入大量记录,并且需要数小时才能执行。在执行时,IIS 进程可能需要回收或 Web 服务器需要重新启动或其他导致 IIS 进程结束并因此中止存储过程的执行的事情。

我决定在断开连接的环境中从 w3wp.exe 进程中运行存储过程。

解决方案:

  • Service Broker 激活:我读过this,但它很复杂,而且diagnosting service queue is difficult
  • 在 Windows 服务下运行:
  • 定义一个 SQL Server 作业:它需要 SQLAgentReaderRole 角色权限,我需要将参数传递给存储过程

还有其他解决方案吗?

【问题讨论】:

  • 从 Web 应用程序调用的控制台应用程序怎么样?这是一个非常简单的解决方案,你可以传递参数,它可以运行几个小时
  • Windows Service 比 Console App 好,但重启服务器时两者都不会自动运行。服务代理解决方案支持这一点。
  • 我用过hangfire.io,它适用于这类事情。

标签: c# sql-server iis stored-procedures


【解决方案1】:

我个人更喜欢 Windows 服务路线。最近我使用了self-hosted WebApi,它允许我从 MVC 开始一个长时间运行的工作(使用 HttpClient 或 System.Net.HttpWebRequest 等)。

【讨论】:

  • 如果重启web服务器并注册windows服务也需要再次调用sp。我认为最佳实践是第一个解决方案,Sql Service Broker
  • 而且windows服务即使什么也不做也会消耗资源。
  • 这些是有效积分。我不会将服务用于这一单一目的,只有当它也在做其他事情时,才能证明资源消耗是合理的。但是服务可以轻松处理在重新启动时执行您的 sp。
【解决方案2】:

CLR 程序集。

将您的代码更改为类库,并将类库的dll结果导入为SSMS的汇编函数,使用此代码

CREATE ASSEMBLY myAssembly from 'E:\Projects\CL.dll'

现在您可以调用它而无需担心 IIS 停止。

【讨论】:

  • 重启web服务器也需要再次调用sp。我认为最佳实践是第一个解决方案,Sql Service Broker
  • 我问的是存储过程,而不是 .net 代码。我也更喜欢使用纯 sql server 特性和功能而不是 CLR 程序集,因为它更易于维护,而且我不确定 CLR 程序集的性能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2014-02-11
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多