在高容量.NET应用程序中,您可能会在尝试执行查询时看到此异常:
System.Data.SqlClient.SqlException:将请求发送到服务器时发生传输级错误.
根据我的研究,这是"刚刚发生"的事情,并没有太多可以防止它.它不会因错误查询而发生,通常无法复制.当由于某种原因与数据库的TCP连接变坏时,它在繁忙的OLTP系统中可能每隔几天就会出现一次.
我被迫通过解析异常消息,然后从头开始重试整个操作来检测此错误,以包括使用新连接.这些都不是很好.
有人有任何替代解决方案吗?
我在另一个可能有一些用处的话题上发布了另一个问题的答案.答案涉及SMB连接,而不是SQL.然而,它是相同的,因为它涉及低级传输错误.
我们发现,在负载很重的情况下,远程服务器很容易在TCP层超时,因为服务器很忙.部分原因是TCP在Windows上重新传输数据的次数的默认值不适合我们的情况.
查看用于在Windows上调整TCP/IP的注册表设置.特别是你想看看TcpMaxDataRetransmissions和TcpMaxConnectRetransmissions.这些默认分别为5和2,尝试在客户端系统上稍微增加它们并复制负载情况.
别发疯了!TCP会在每次连续重传时使超时时间加倍,因此如果增加太多,则不良连接的超时行为会成为指数.我记得在大多数情况下,将TcpMaxDataRetransmissions提升到6或7解决了我们的问题.