Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server-在“中取消查询”;异步“网络io”;状态_Sql Server_Sql Server 2012_Llblgenpro_Async Network Io - Fatal编程技术网

Sql server SQL Server-在“中取消查询”;异步“网络io”;状态

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进程保持活动状态并阻塞表,直到客户机应用程序关闭

我们的一个客户使用SQL server 2012拥有一台性能非常高的服务器,能够在很短的时间内处理大量数据。 不幸的是,网络似乎没有那么高效。 作为客户端,用户可以使用LLBLGen(ORMapper)设置过滤器和查询视图。 视图有许多字段,但只是一组简单的内部联接。在长时间内,它返回大量数据。 客户端操作员还可以手动取消正在进行的查询。 在正常情况下,一切正常

特别的问题是,当一个查询正在从客户机进行时,操作员手动决定中断它:在这些情况下,SQL进程保持活动状态并阻塞表,直到客户机应用程序关闭。 具体而言,条件是:

  • 查询在几秒钟内进入“async\u network\u io”,并在那里停留数十秒钟。换句话说,处理是非常重要的 比传输信息更快
  • 如果查询在进入“async\u network\u io”状态之前被取消,则删除成功
  • 如果在“异步网络io”状态下取消查询,则 这一过程似乎受阻了
我们能够系统地重新创建它,但我们不知道如何进行干预,也不知道这是SQL、网络还是LLBLGen问题。 我们还试图更新该项目的.NET框架(最初是使用.NET2.0),但结果似乎是一样的


对此有何建议?

尽管名称不同,
异步网络IO
通常与实际网络无关。这意味着SQL Server正在等待异步网络I/O操作完成,这通常是由于客户端处理数据的速度不够快。如果操作“挂起”,这表明SQL Server或客户端正处于死锁状态,其中一方发出了取消,但另一方没有意识到这一点(因此发送结果集的过程永远不会结束,并且锁定仍保持不变)。要排除SQL Server为罪魁祸首,尝试在SQL Server 2017实例上重新编程(LocalDB/Express是免费的);我假设数据的大小实际上不是这里的一个因素。因此,问题是在ORMapper中搜索?客户端从辅助线程进行调用。删除包括一个简单的线程中止,在该线程内执行所有对象和连接的处置。因此,问题可能与SQL Server版本有关?是的,这肯定是错误的。取消的正确方法是调用
SqlCommand.cancel()
,这将在处理结果的代码中生成一个异常(如果您首先设置一个标志,然后检查该标志,则可以干净地处理该异常,因为生成的错误看起来很可怕)。中止线程要么什么都不做(因为托管代码会耐心地等待线程到达安全位置后再执行),要么让应用程序处于不一致的状态。此外,SQL类在默认情况下不是线程安全的;只有很少的事情可以从多个线程中完成,取消一个线程。