我有一个Java应用程序从Microsoft SQL Server(Microsoft SQL Server 2008 R2(SP3))请求大约240万条记录
应用程序在所有主机上运行正常,除了一个。在此主机上,应用程序可以在某些情况下检索数据。但在其他一些问题上,它仍然存在。
监视MS Sql服务器表示与查询关联的SPID处于ASYNC_NETWORK_IO等待状态。
网上有一些链接可以谈论它 https://blogs.msdn.microsoft.com/joesack/2009/01/08/troubleshooting-async_network_io-networkio/
基于以上所述,ASYNC_NETWORK_IO意味着两件事: 1.应用程序处理结果的速度很慢 2.应用程序和数据库之间的网络存在一些问题。
对于上面的#1,我们使用tcpdumps进行了分析,发现在查询进入ASYNC_NETWORK_IO状态的情况下,应用服务器的tcp连接的窗口大小介于0和小数之间,最终仍然停留在0基于更多的分析,与数据库和应用程序之间的防火墙相关的方面也被排除在外。
所以我盯着#2,无法理解什么可能出错。更令人费解的是,因为相同的代码已经在类似的数据加载下运行了一年多。它在其他主机上运行良好。
正在使用的JDBC驱动程序是sqljdbc4-4.0.jar。 默认情况下,它具有自适应缓冲功能,可以根据需要进行操作以减少应用程序资源。 我们使用128的默认提取大小(我认为这不是一个好的)。
所以我将尝试覆盖默认的自适应缓冲行为,尽管MS文档建议对大型结果集进行自适应缓冲是很好的。
我将更改连接设置以使用selectMethod = cursor。 并且还将fetchSize更改为1024。
现在如果它不起作用:
如果它确实一致,那么将连接设置更改为selectMethod = cursor
会产生什么影响?更新:我测试了将selectMethod =游标添加到连接的应用程序。但是,它会产生与上述相同的问题。
基于与团队中其他管理员的讨论 - 此时问题可能出在jdbc驱动程序或OS上(当它尝试处理网络上的数据时)。
答案 0 :(得分:0)
经过与系统管理员,网络管理员和数据库管理员的大量讨论后,人们同意在操作系统的某个地方 - >应用程序堆栈,来自网络的数据未被处理。与此同时,我们测试了一个解决方案,我们分解了查询以返回较小的结果。因此我们将其分解为5个查询,每个查询返回约500k条记录。
现在,当我们按顺序运行这些查询时,我们仍然遇到了同样的问题。
但是,当我们并行运行查询时,它总是成功的。
鉴于该解决方案始终有效,我们不再费心去解决问题的根本原因。
另一方面,运行该应用程序的硬件和软件也已过时。它正在运行Red Hat 5.所以,它可能需要做一些事情。