【问题标题】:How to avoid timeout and execute a stored procedure Azure SQL database如何避免超时并执行存储过程 Azure SQL 数据库
【发布时间】:2019-06-27 10:39:13
【问题描述】:

我有一个 Azure 云服务,它在后台执行一些操作。我想执行一个无法确定执行时间的存储过程。所以请不要建议设置超时,因为有时它会在微秒内完成,而另一种运行可能需要超过一分钟。

我只需要触发存储过程执行并忘记它。但看起来我已经尝试了几种方法,但我找不到可行的解决方案。

我已经尝试了以下

var cmd = new SqlCommand("Purge_Data", connection)
              { CommandType = CommandType.StoredProcedure };

connection.Open();

Task.Run(() => cmd.ExecuteNonQueryAsync()));

cmd.BeginExecuteNonQuery(); 也根本没有触发存储过程。我已经用一个简单的控制台应用程序以及 .NET 4.6.1 进行了尝试。

请提出其他更好的方法

【问题讨论】:

  • 不建议设置超时时间”那么您认为我们还能如何帮助您?
  • @DavidG 我们正在处理大量数据,所以我很困惑设置最大超时
  • 您遇到的另一个问题是connection 对象可能会在任务运行时被丢弃。您应该将所有内容包装在一个方法中并调用它。
  • 任务是否需要向应用程序返回任何内容?如果没有,你能让它启动一个代理任务吗?然后您会得到确认任务已开始,但其余部分(由代理)在不同的会话中完成。
  • 好吧,您显然缺少一些理解,因为 void 对异步的影响为零,除了您无论如何都没有捕获的异常。将超时设置为零是解决您的问题的一种解决方法,但这是一个超级危险的解决方法。如果我的一个开发人员提交了这样的代码,我会立即拒绝它并告诉他们寻找另一种方式。

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


【解决方案1】:

默认超时为 30 秒,因此您只能通过更改超时来解决您的问题。

如果您将超时设置为 0,这意味着“无超时” - 您的存储过程将在必要时运行。

当然,这也意味着如果您的存储过程存在设计缺陷/无限循环,它将永远运行。

您可以通过几种方式来处理它。监控正在运行的进程并在它离开你时提醒你,或者设置一个不可能的高但不是无限的超时(你提到“微秒或超过一分钟”,所以增加一个数量级并将超时设置为几个小时)。

【讨论】:

  • 您可能需要添加未明确设置时的默认超时时间为 30 秒。
  • @HariHaran 这不是完美的解决方案。阅读 P_J 的警告。它使您的 SP 能够永远运行它需要的时间。如果它是共享 SQL 服务器,您的 SP 可能会查询被另一个进程锁定或正在使用的表。发生这种情况时,您的 SP 将永远运行而不会引发错误,因为您没有超时。这真是太糟了。我建议你安排一个时间。在您的代码中使用Polly,当超时重试并且如果再次失败则引发日志/警报并重构您的超时
猜你喜欢
  • 1970-01-01
  • 2012-04-27
  • 2019-04-22
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多