我有一个.NET Core 2.1应用程序,该应用程序允许用户搜索大型数据库,并且可以使用很多参数。数据访问通过ADO.NET完成。生成的某些查询会导致查询长时间运行(几个小时)。显然,用户放弃了等待,但是查询在SQL Server中失败了。
我意识到根本原因是应用程序的设计,但如果可能的话,我现在想寻求一个快速的解决方案。
我尝试了许多解决方案,但是似乎都没有按预期的那样工作。
我尝试过的事情:
CommandTimeout
CommandTimeout
在ExecuteNonQuery
上可以正常使用,但在ExecuteReader
下不能正常使用,如in this forum
执行
command.ExecuteReader()
时,不会出现此异常,因为服务器会及时响应。该应用程序没有响应,因为它将数据读取到内存中,并且ExecuteReader()
方法在读取所有数据之前不会返回控制权。
我也尝试过使用 SqlDataAdapter ,但这也不起作用。
SQL Server查询调控器
SQL Server的查询调控器无法执行估计的执行计划,尽管有时可以正常运行,但它并不总是能够捕获效率低下的查询。
SQL Server执行超时
工具>选项>查询执行> SQL Server>常规
我不确定这是做什么的,但是在输入值1之后,SQL Server仍允许查询根据需要运行。我尝试重新启动服务器实例,但这没有任何区别。
同样,我意识到导致此问题的原因是查询的生成方式,但是由于参数太多,数据太多,因此在应用程序设计中微调解决方案可能需要一些时间。截至目前,我们正在手动杀死与该应用相关联的,运行时间超过10分钟左右的spid。
编辑:
我放弃了寻找简单解决方案的希望。如果您遇到类似的问题,请采取以下措施来解决该问题:
我们创建了一个.net核心控制台应用程序,该应用程序轮询数据库以查询在特定分配时间内运行的查询。该应用程序查看登录名和运行时间,并确定是否终止该进程。
答案 0 :(得分:2)
仔细阅读有关SqlCommand.Cancel的文档,我认为它可能可以解决您的问题。
如果要在调用ExecuteReader()之前创建并启动一个Timer,则可以跟踪查询运行了多长时间,并最终自己调用Cancel方法。
(注意:我想将此添加为评论,但我尚无信誉)