Sql server SQL Server-在“中取消查询”;异步“网络io”;状态
我们的一个客户使用SQL server 2012拥有一台性能非常高的服务器,能够在很短的时间内处理大量数据。 不幸的是,网络似乎没有那么高效。 作为客户端,用户可以使用LLBLGen(ORMapper)设置过滤器和查询视图。 视图有许多字段,但只是一组简单的内部联接。在长时间内,它返回大量数据。 客户端操作员还可以手动取消正在进行的查询。 在正常情况下,一切正常 特别的问题是,当一个查询正在从客户机进行时,操作员手动决定中断它:在这些情况下,SQL进程保持活动状态并阻塞表,直到客户机应用程序关闭。 具体而言,条件是:Sql server SQL Server-在“中取消查询”;异步“网络io”;状态,sql-server,sql-server-2012,llblgenpro,async-network-io,Sql Server,Sql Server 2012,Llblgenpro,Async Network Io,我们的一个客户使用SQL server 2012拥有一台性能非常高的服务器,能够在很短的时间内处理大量数据。 不幸的是,网络似乎没有那么高效。 作为客户端,用户可以使用LLBLGen(ORMapper)设置过滤器和查询视图。 视图有许多字段,但只是一组简单的内部联接。在长时间内,它返回大量数据。 客户端操作员还可以手动取消正在进行的查询。 在正常情况下,一切正常 特别的问题是,当一个查询正在从客户机进行时,操作员手动决定中断它:在这些情况下,SQL进程保持活动状态并阻塞表,直到客户机应用程序关闭
- 查询在几秒钟内进入“async\u network\u io”,并在那里停留数十秒钟。换句话说,处理是非常重要的 比传输信息更快
- 如果查询在进入“async\u network\u io”状态之前被取消,则删除成功
- 如果在“异步网络io”状态下取消查询,则 这一过程似乎受阻了
对此有何建议?尽管名称不同,
异步网络IO
通常与实际网络无关。这意味着SQL Server正在等待异步网络I/O操作完成,这通常是由于客户端处理数据的速度不够快。如果操作“挂起”,这表明SQL Server或客户端正处于死锁状态,其中一方发出了取消,但另一方没有意识到这一点(因此发送结果集的过程永远不会结束,并且锁定仍保持不变)。要排除SQL Server为罪魁祸首,尝试在SQL Server 2017实例上重新编程(LocalDB/Express是免费的);我假设数据的大小实际上不是这里的一个因素。因此,问题是在ORMapper中搜索?客户端从辅助线程进行调用。删除包括一个简单的线程中止,在该线程内执行所有对象和连接的处置。因此,问题可能与SQL Server版本有关?是的,这肯定是错误的。取消的正确方法是调用SqlCommand.cancel()
,这将在处理结果的代码中生成一个异常(如果您首先设置一个标志,然后检查该标志,则可以干净地处理该异常,因为生成的错误看起来很可怕)。中止线程要么什么都不做(因为托管代码会耐心地等待线程到达安全位置后再执行),要么让应用程序处于不一致的状态。此外,SQL类在默认情况下不是线程安全的;只有很少的事情可以从多个线程中完成,取消一个线程。