2009-07-20 67 views
14

我有一些运行在SQL 2000数据库后端服务器上的ASP.Net网站(.Net v3.5)。几个月来,我一直在收到看似随机的InvalidOperationExceptions消息,内容为“内部连接致命错误”。有时候会有几天的时间,而其他时间每天都有很多错误。什么导致“内部连接致命错误”

虽然它们共享业务和数据访问程序集,但异常并不局限于特定的一个站点。该错误似乎总是从SqlClient.TdsParser.Run()中抛出。它有时是从老派的直接SqlCommand.Execute()调用抛出的,有时则是从Linq2Sql代码抛出。

我一直向网络工作人员保证,在它们的末端没有错误或数据包丢失。有没有其他人经历过这个?它可能是一个驱动程序问题?我们一直未能确定这一例外的具体触发因素。

我们在Windows Server上运行II6 2003

回答

21

经过几个月的忽视这个问题,随着交通量逐渐增加,它开始达到临界质量。在重负载下,包括一些爬虫,事情变得疯狂,这些错误不停地涌入。

通过试验和错误,我们最终追踪了一些SqlCommand或LINQ查询,其SqlConnection在使用后没有立即关闭。相反,通过一些源于对LINQ连接误解的拙劣编程,DataContext对象仅在请求结束时才被处理(并关闭连接),而不是立即处理。

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

1

检查服务器的日志文件夹(\ Program Files文件\ Microsoft SQL Server的\ MSSQL.1 \ MSSQL \ LOG或类似)为命名的文件SqlDump * .mdmp和SqlDump * .TXT。如果您确实发现任何问题,您必须将其提交给产品支持部门。

1

声音像数据库连接正在下降或超时。

我们最近有类似的问题从IIS 5连接到SQL 2000迁移到IIS 6.我们的问题已通过增加可用的临时端口数量来解决。

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

您可以先监控这些是否超过最大限制。

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

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

无论如何检查存储过程的效率,因为他们可能需要的时间比他们需要的还要长。

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