SQL Server & ADO NET: 如何自动取消长运行 用户查询?
SQL Server & ADO NET : how to automatically cancel long running user query?
我有一个 .NET Core 2.1 应用程序,允许用户搜索大型数据库,并可能使用大量参数。数据访问是通过 ADO.NET 完成的。生成的一些查询会导致长时间 运行ning 查询(几个小时)。显然,用户放弃了等待,但查询在 SQL 服务器中进行。
我意识到根本原因是应用程序的设计,但如果可能的话,我现在想要一个快速的解决方案。
我尝试了很多解决方案,但 none 似乎按预期工作。
我尝试过的:
命令超时
CommandTimeout
按预期与 ExecuteNonQuery
一起工作,但不与 ExecuteReader
一起工作,如 in this forum
所讨论
When you execute command.ExecuteReader()
, you don't get this exception because the server responds on time. The application doesn't respond because it reads data to the memory, and the ExecuteReader()
method doesn't return control until all the data is read.
我也尝试过使用 SqlDataAdapter,但这也不起作用。
SQL服务器查询governor
SQL 服务器的查询调控器根据估计的执行计划工作,虽然它有时会工作,但并不总是能捕获低效查询。
SQL 服务器执行超时
工具 > 选项 > 查询执行 > SQL 服务器 > 常规
我不确定这是做什么的,但是在输入值 1 后,SQL 服务器仍然允许根据需要查询 运行。我尝试重新启动服务器实例,但这没有任何区别。
再次,我意识到这个问题的原因是查询的生成方式,但是有这么多的参数和数据,在应用程序的设计中微调解决方案可能需要一些时间。截至目前,我们正在手动终止与此应用关联的任何 运行 超过 10 分钟左右的 spid。
编辑:
我放弃了寻找简单解决方案的希望。如果您遇到类似问题,我们采取了以下措施来解决该问题:
我们创建了一个 .net 核心控制台应用程序,用于在特定分配的时间内轮询数据库以查找查询 运行ning。该应用会查看登录名和登录时间 运行ning 并确定是否终止进程。
查看 SqlCommand.Cancel 上的文档,我认为它可能会解决您的问题。
如果您要在调用 ExecuteReader() 之前创建并启动一个计时器,那么您可以跟踪查询的时长 运行,并最终自己调用 Cancel 方法。
(注意:我想将此添加为评论,但我还没有被允许的声誉)
我有一个 .NET Core 2.1 应用程序,允许用户搜索大型数据库,并可能使用大量参数。数据访问是通过 ADO.NET 完成的。生成的一些查询会导致长时间 运行ning 查询(几个小时)。显然,用户放弃了等待,但查询在 SQL 服务器中进行。
我意识到根本原因是应用程序的设计,但如果可能的话,我现在想要一个快速的解决方案。
我尝试了很多解决方案,但 none 似乎按预期工作。
我尝试过的:
命令超时
所讨论CommandTimeout
按预期与ExecuteNonQuery
一起工作,但不与ExecuteReader
一起工作,如 in this forumWhen you execute
command.ExecuteReader()
, you don't get this exception because the server responds on time. The application doesn't respond because it reads data to the memory, and theExecuteReader()
method doesn't return control until all the data is read.我也尝试过使用 SqlDataAdapter,但这也不起作用。
SQL服务器查询governor
SQL 服务器的查询调控器根据估计的执行计划工作,虽然它有时会工作,但并不总是能捕获低效查询。
SQL 服务器执行超时
工具 > 选项 > 查询执行 > SQL 服务器 > 常规
我不确定这是做什么的,但是在输入值 1 后,SQL 服务器仍然允许根据需要查询 运行。我尝试重新启动服务器实例,但这没有任何区别。
再次,我意识到这个问题的原因是查询的生成方式,但是有这么多的参数和数据,在应用程序的设计中微调解决方案可能需要一些时间。截至目前,我们正在手动终止与此应用关联的任何 运行 超过 10 分钟左右的 spid。
编辑:
我放弃了寻找简单解决方案的希望。如果您遇到类似问题,我们采取了以下措施来解决该问题:
我们创建了一个 .net 核心控制台应用程序,用于在特定分配的时间内轮询数据库以查找查询 运行ning。该应用会查看登录名和登录时间 运行ning 并确定是否终止进程。
查看 SqlCommand.Cancel 上的文档,我认为它可能会解决您的问题。
如果您要在调用 ExecuteReader() 之前创建并启动一个计时器,那么您可以跟踪查询的时长 运行,并最终自己调用 Cancel 方法。
(注意:我想将此添加为评论,但我还没有被允许的声誉)