什么原因导致“内部连接致命错误”

时间:2009-07-20 18:54:48

标签: asp.net sql-server iis-6 sql-server-2000 asp.net-3.5

我在一台带有SQL 2000数据库后端的服务器上运行了许多ASP.Net网站(.Net v3.5)。几个月来,我一直在接收看似随机的InvalidOperationExceptions,并显示消息“内部连接致命错误”。有时间隔几天,而其他时间每天都有多处错误。

异常并不仅限于一个站点,尽管它们共享业务和数据访问程序集。似乎总是从SqlClient.TdsParser.Run()抛出错误。它有时是从老式的直接SqlCommand.Execute()调用抛出的,而有时它是从Linq2Sql代码抛出的。

网络人员确信我们没有错误或数据包丢失。还有其他人经历过这个吗?这可能是司机的问题吗?到目前为止,我们还无法确定此异常的特定触发器。

我们在Windows Server 2003上运行II6。

4 个答案:

答案 0 :(得分:22)

在忽略了这个问题几个月之后,随着流量逐渐增加,它开始达到临界质量。在重载下,包括一些爬行器,事情变得疯狂,这些错误不断涌入。

通过反复试验,我们最终找到了一些SqlCommand或LINQ查询,这些查询的SqlConnection在使用后没有立即关闭。相反,通过一些源于对LINQ连接的误解的草率编程,DataContext对象仅在请求结束时而不是立即处理(并且连接关闭)。

一旦我们重构这些方法以立即关闭与C#“使用”块的连接(为下一个请求释放该池),我们就不再收到错误。虽然我们仍然不知道连接池会如此混淆的根本原因,但我们能够停止此类错误。此问题已与我发布的另一个类似错误一起解决,可在此处找到:Why is my SqlCommand returning a string when it should be an int?

答案 1 :(得分:2)

听起来数据库连接被丢弃或超时。

我们最近有类似的问题从IIS 5连接到SQL 2000转移到IIS 6.我们的问题通过增加可用的短暂端口来解决。

查看IIS服务器对临时端口的使用情况。默认最大值可用的端口通常为4000.如果服务器上的站点特别繁忙或者您的应用程序正在进行大量数据库调用,您可能需要考虑增加此值。

您可以先监视这些内容,看看是否超过最大限制。

在Microsoft知识库中搜索“MaxUserPort”和“TcpTimedWaitDelay”,并进行必要的注册表更改。确保在进行更改之前备份注册表或快照服务器。需要重启才能使更改生效。

您应该仔细检查数据库和记录集连接是否在使用后关闭。不关闭会不必要地耗尽此端口范围。

检查存储过程的效率,因为它们可能需要的时间比他们需要的时间长。

“如果您在不到四分钟的时间内快速打开并关闭4000个套接字,您将达到客户端匿名端口的默认最大设置,并且新的套接字连接尝试将失败,直到现有的TIME_WAIT套接字超时为止。” - 来自http://support.microsoft.com/kb/328476

答案 2 :(得分:1)

检查服务器的LOG文件夹(\ program files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ LOG或类似文件),查找名为SqlDump * .mdmp和SqlDump * .txt的文件。如果您确实发现任何必须将其带到产品支持。

答案 3 :(得分:0)

我正在创建一个新的 EF Core 项目,并尝试将数据库创建到外部 Linux 服务器而不是 Windows 服务器或本地服务器。经过数小时的搜索,我发现我使用的是 MySQL 而不是 Microsoft SQL 服务器。

我发现每个人都使用 1433 而不是通常的 3306,这很奇怪。所以为了解决我的“内部连接致命错误”,我必须设置一个 SQL Server 的 docker 实例,绑定到它的默认端口 1433。

字面上就是这么简单。在 docker repo 中查找“microsoft-mssql-server”并按照下面的描述中整齐地描述运行图像。现在一切正常,我可以将我的数据库从我的 EF Core 项目推送到外部服务器。