间歇性 SQL 异常 - 与网络相关或实例特定的错误

5

最近一个月左右,我们遇到了一个非常奇怪的间歇性问题,即连接到mssql服务器的一些连接失败并出现以下错误:

System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

这个错误不会导致网站崩溃,也不需要重新启动数据库 - 如果您只是重新运行相同的查询,第二次就可以正常工作。这意味着很多用户偶尔会遇到错误,必须刷新错误页面才能正常工作。
现在,我的最初反应是可能是由于以下原因之一:
1. 资源相关问题 - 所以我开始运行SQL分析器和perfmon,但没有发现服务器在处理连接/秒的数量方面出现任何问题。我一直在查看MSSQL:SQL Errors、MSSQL:Wait Statistics、MSSQL:Exec Statistics、MSSQL:Locks。有人对我在这里应该探索和检查的其他统计数据有指导吗?
2. 未关闭的数据库连接 - 在经过所有数据层代码的检查后,我排除了这个问题。我们已经设置了所有故障保护措施,以防止这种情况发生。
3. 连接/网络相关问题:我们的SQL服务器位于一个单独的服务器上(MS SQL Server Standard 2008),而我们的应用程序服务器(在IIS7上运行ASP.Net)位于另一台服务器上 - 两台服务器都在xlarge Amazon EC2实例上运行,并配置了所有安全策略(根据Amazon的指示)。有人知道如何测试两个服务器之间的连接或者这可能是问题吗?
4. 是否可能是IIS连接字符串的问题?我没有测试过,但我们是否应该使用完全限定的服务器名称来连接(刚想到)?我们使用的连接字符串格式为:server=xxxxx;Database=xxxx;uid=xxxx;password=xxx; 非常感谢您的想法和见解!
提前致谢。
4个回答

4

问题已解决。在测试了几乎所有可能的性能指标并检查了每一行代码后,我发现错误是由于一个过时的数据库代码引起的。主要问题是由使用以下代码引起的:

SqlConnection.ClearPools;

供以后参考,任何其他开发人员想要调试他们的代码和管理连接池,可以在这里找到一个很好的资源:http://www.codeproject.com/KB/dotnet/ADONET_ConnectionPooling.aspx


6
你能详细说明一下吗?具体来说,问题是什么,你又是如何解决的? - Jess Chadwick

3
尝试将连接字符串更改为FQDN+端口。
server=xxxxx.domain.tld,1234;

注意:如果使用端口,则不需要任何实例名称。
在我们的全球公司内部网络中...我们遇到了类似的问题,发生在远程客户端身上:如果他们与服务器不在同一建筑物内,那么这种情况更加频繁。
经过一番探索,与数据库管理员和微软的交流后,被认为是由于时间/Kerberos/太多防火墙等原因引起的。添加FQDN+端口解决了我们所有的问题。

2

如果可能的话,您可以通过切换到TCP/IP而不是命名管道来解决问题。也许您可以通过将服务器名称更改为服务器IP地址来测试。

我在连接字符串中使用server=tcp:servername来强制使用TCP。KB313295


2

看起来连接没有正确关闭,过一段时间后就无法再打开新的连接。因为数据库允许的总连接数是一个固定的数字。

如果您正在使用C# / VB.net

您是否使用“Using”语句来打开连接?

using (System.Data.SqlClient.SqlConnection con = new SqlConnection("YourConnection string")) 
{ 
    con.Open(); 
}

1
谢谢您的建议 - 但是正如我所说,在浏览了所有数据层代码之后,我已经排除了这个问题。我们已经设置了所有故障保护措施,以防止这种情况发生。也就是说,我们已经实现了使用语句。 - StacMan

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