我们如何处理SqlConnection中的传输级错误?
时不时地在大量的.NET应用程序中,当我们尝试执行查询时,我们可能会看到此异常:
System.Data.SqlClient.SqlException: A transport-level error has occurred when sending the request to the server.
根据我的研究,这是"正好发生"的事情,无法做很多事情来阻止它。它不会因查询错误而发生,并且通常无法重复。当与数据库的TCP连接由于某种原因出现故障时,它可能仅在繁忙的OLTP系统中每隔几天就出现一次。
我被迫通过解析异常消息来检测此错误,然后从头开始重试整个操作,以包括使用新连接。这些都不是漂亮的。
有人有其他替代解决方案吗?
解决方案
回答
我们还应该检查与数据库的硬件连接。
也许该线程会有所帮助:
http://channel9.msdn.com/forums/TechOff/234271-Conenction-forcfully-closed-SQL-2005/
回答
我在数据库命令周围使用可靠性层(在存储库接口中进行了抽象)。基本上,这只是截取任何预期异常(DbException和InvalidOperationException的代码,它碰巧会引发连接问题),记录日志,捕获统计信息并再次重试所有内容。
有了该可靠性层,该服务就能够正常进行压力测试(持续的死锁,网络故障等)。生产远没有那么有害。
PS:这里还有更多内容(以及使用拦截DSL定义可靠性的简单方法)
回答
要回答原始问题:
在不解析错误消息的情况下,检测此特定错误的一种更优雅的方法是检查SqlException的Number属性。
(这实际上从Errors集合中的第一个SqlError返回错误号,但是在情况下,传输错误应该是该集合中唯一的错误。)
回答
我有同样的问题。我问我的网络极客朋友,所有人都说人们在这里回答了什么:它是计算机和数据库服务器之间的连接。在我的情况下,这是我的Internet服务提供商,或者那里的路由器是问题所在。路由器更新后,问题消失了。但是,我们是否从计算机或者服务器上退出了互联网连接?我有...
回答
我在另一个主题上发布了另一个问题的答案,可能在这里有用。答案涉及SMB连接,而不涉及SQL。但是,这是相同的,因为它涉及低级别的传输错误。
我们发现,在负载很重的情况下,仅由于服务器繁忙,远程服务器在TCP层上使连接超时非常容易。部分原因是默认值,即TCP在Windows上重传数据的次数不适合我们的情况。
查看用于在Windows上调整TCP / IP的注册表设置。特别是,我们想查看TcpMaxDataRetransmissions,也许还要看一下TcpMaxConnectRetransmissions。它们的默认值分别为5和2,请尝试在客户端系统上将其提升一点并复制负载情况。
别疯了! TCP每次连续重传都会使超时加倍,因此,如果增加过多错误连接的超时行为将使我们成倍增长。当我记得将TcpMaxDataRetransmissions设置为6或者7时,在大多数情况下解决了我们的问题。
回答
我已经多次在自己的环境中看到这种情况。在这种情况下,客户端应用程序已安装在许多计算机上。其中一些机器恰好是笔记本电脑用户,他们在打开应用程序的连接时将其断开,然后重新插入并尝试使用它。然后,这将导致我们提到的错误。
我的第一点将是查看网络,并确保服务器不在DHCP上并更新IP地址,从而导致此错误。如果不是这种情况,那么我们必须开始遍历事件日志以寻找其他与网络相关的信息。
不幸的是,如上所述,它是网络错误。我们可以做的主要事情就是使用netmon之类的工具监视连接,然后从那里进行工作。
祝你好运。
回答
Michael Aspengren的这篇博客文章解释了错误消息"将请求发送到服务器时发生传输级错误"。
回答
我遇到了同样的问题,尽管它与对SQL DB的服务请求有关。
这是我在服务错误日志中的内容:
System.Data.SqlClient.SqlException:将请求发送到服务器时,发生了传输级错误。 (提供者:TCP提供程序,错误:0远程主机强行关闭了现有连接。)
我有一个测试服务的Ctest套件。服务和数据库都在外部服务器上,所以我认为可能是问题所在。因此,我在本地部署服务和数据库无济于事。问题继续。该测试套件甚至根本不是一项艰巨的性能测试,因此我不知道发生了什么。相同的测试每次都会失败,但是当我禁用该测试时,另一个测试将连续失败。
我尝试了互联网上建议的其他方法,这些方法也不起作用:
- 增加TcpMaxDataRetransmissions和TcpMaxConnectRetransmissions的注册表值。
- 禁用SQL Server配置管理器中"客户端协议"下的"共享内存"选项,并将TCP / IP排序为列表中的第1个。
- 当我们尝试使用大量客户端连接尝试测试可伸缩性时,可能会发生这种情况。若要解决此问题,请使用regedit.exe实用工具将名为SynAttackProtect的新DWORD值添加到注册表项HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \,其值数据为00000000。
我的最后一招是使用古老的话说"再试一次"。因此,我嵌套了try-catch语句,以确保如果较低层的通信协议中的TCP / IP连接丢失,那么它不仅会在那里放弃,而是会再次尝试。现在这对我有用,但这不是一个很好的解决方案。
回答
将企业服务与事务组件一起使用
回答
据我所知,第20类是运输级别。