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

21

我在一台带有SQL 2000数据库后端的服务器上运行着多个ASP.Net网站(.Net v3.5)。几个月来,我一直收到看似随机的InvalidOperationExceptions异常,其中包含“内部连接致命错误”的消息。有时候这些异常之间会隔上几天,而有时候一天中会出现多个。

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

网络工程师向我保证他们那边没有任何错误或数据包丢失。有其他人遇到过类似的问题吗?这可能是驱动程序问题吗?到目前为止,我们还无法确定此异常的具体触发器。

我们正在运行Windows Server 2003上的II6。

4个回答

25

在忽略了这个问题几个月后,随着流量逐渐增加,它开始达到临界质量。 在重载情况下,包括一些网络爬虫,事情变得混乱,这些错误不断涌现。

经过试错,我们最终追踪到一些SqlCommand或LINQ查询,其SqlConnection在使用后未立即关闭。 相反,由于对LINQ连接的误解而产生的一些粗心编程,DataContext对象仅在请求结束时(而非立即)被处理程序释放(并关闭连接)。

一旦我们重构了这些方法以通过C# "using"块立即关闭连接(为下一个请求释放该池),我们就不再收到任何错误。 虽然我们仍然不知道导致连接池混乱的根本原因,但我们能够停止所有此类错误。 这个问题是与我发布的另一个类似错误一起解决的,可以在这里找到:为什么我的SqlCommand应该返回int却返回了字符串?


2
听起来像是数据库连接断开或超时了。
我们最近在从IIS 5转移到IIS 6并连接到SQL 2000时遇到了类似的问题。我们通过增加可用的短暂端口数量来解决了这个问题。
查看IIS服务器使用的短暂端口的情况。默认的最大端口数通常为4000。如果您的服务器上的站点特别繁忙或应用程序正在进行大量的数据库调用,则可能需要考虑增加此数字。
您可以首先监视这些内容,以查看是否超过了最大限制。
在Microsoft知识库中搜索“MaxUserPort”和“TcpTimedWaitDelay”,并进行必要的注册表更改。确保在进行更改之前备份注册表或快照服务器。更改后需要重新启动才能生效。
您应该仔细检查数据库和记录集连接是否在使用后被关闭。不关闭会不必要地使用此端口范围。
无论如何都要检查存储过程的效率,因为它们可能比需要的时间长。
"If you rapidly open and close 4000 sockets in less than four minutes, you will reach the default maximum setting for client anonymous ports, and new socket connection attempts fail until the existing set of TIME_WAIT sockets times out." - 来自http://support.microsoft.com/kb/328476

1

请检查您的服务器的日志文件夹(\program files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG或类似位置)是否存在名为SqlDump*.mdmp和SqlDump*.txt的文件。如果找到任何这样的文件,您需要将其提交给产品支持团队。


0
我正在创建一个新的EF Core项目,并尝试将数据库创建到外部Linux服务器而不是Windows服务器或本地服务器。经过几个小时的搜索,我发现我正在使用MySQL而不是Microsoft SQL Server。
我发现很奇怪的是,每个人都在使用1433而不是通常的3306。所以为了解决我的“内部连接致命错误”,我必须设置一个绑定到其默认端口1433的SQL Server的docker实例。
这真的很简单。在docker存储库中查找“microsoft-mssql-server”,并按照下面的描述运行图像。现在一切都正常了,我能够从我的EF Core项目推送我的数据库到外部服务器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接