SQL Server和ADO NET:如何自动取消长时间运行的用户查询?

时间:2018-12-29 15:37:44

标签: ado.net

我有一个.NET Core 2.1应用程序,该应用程序允许用户搜索大型数据库,并且可以使用很多参数。数据访问通过ADO.NET完成。生成的某些查询会导致查询长时间运行(几个小时)。显然,用户放弃了等待,但是查询在SQL Server中失败了。

我意识到根本原因是应用程序的设计,但如果可能的话,我现在想寻求一个快速的解决方案。

我尝试了许多解决方案,但是似乎都没有按预期的那样工作。

我尝试过的事情:

  • CommandTimeout

    CommandTimeoutExecuteNonQuery上可以正常使用,但在ExecuteReader下不能正常使用,如in this forum

    所述
      

    执行command.ExecuteReader()时,不会出现此异常,因为服务器会及时响应。该应用程序没有响应,因为它将数据读取到内存中,并且ExecuteReader()方法在读取所有数据之前不会返回控制权。

  • 我也尝试过使用 SqlDataAdapter ,但这也不起作用。

  • SQL Server查询调控器

    SQL Server的查询调控器无法执行估计的执行计划,尽管有时可以正常运行,但它并不总是能够捕获效率低下的查询。

  • SQL Server执行超时

    工具>选项>查询执行> SQL Server>常规

    我不确定这是做什么的,但是在输入值1之后,SQL Server仍允许查询根据需要运行。我尝试重新启动服务器实例,但这没有任何区别。

同样,我意识到导致此问题的原因是查询的生成方式,但是由于参数太多,数据太多,因此在应用程序设计中微调解决方案可能需要一些时间。截至目前,我们正在手动杀死与该应用相关联的,运行时间超过10分钟左右的spid。

编辑:

我放弃了寻找简单解决方案的希望。如果您遇到类似的问题,请采取以下措施来解决该问题:

我们创建了一个.net核心控制台应用程序,该应用程序轮询数据库以查询在特定分配时间内运行的查询。该应用程序查看登录名和运行时间,并确定是否终止该进程。

1 个答案:

答案 0 :(得分:2)

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.cancel?view=netframework-4.7.2

仔细阅读有关SqlCommand.Cancel的文档,我认为它可能可以解决您的问题。

如果要在调用ExecuteReader()之前创建并启动一个Timer,则可以跟踪查询运行了多长时间,并最终自己调用Cancel方法。

(注意:我想将此添加为评论,但我尚无信誉)

相关问题