我们有一个非常奇怪的间歇性问题,在过去一个月左右开始出现,因此与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)
错误不会导致站点崩溃,也不需要重新启动数据库 - 如果您只是重新运行相同的查询将第二次运行。这意味着很多用户会偶尔遇到错误,并且必须刷新错误页面以便工作。
现在,我最初的下意识反应可能是由于:
资源相关问题 - 所以我开始运行SQL分析器和perfmon,但没有发现服务器难以跟上连接数/秒的任何问题。我一直在关注MSSQL:SQL错误,MSSQL:等待统计,MSSQL:Exec Statistics,MSSQL:Locks。有没有人对我应该在这里戳戳和刺激的其他统计数据有任何指导?
未公开的数据库连接 - 在完成所有数据层代码后,我将其排除在外。我们有所有的故障保险柜来阻止这种情况发生。
连接/网络相关问题:我们的SQL服务器位于我们的应用服务器(在IIS7上运行ASP.Net)的单独服务器(MS SQL Server Standard 2008)上 - 两个服务器都在xlarge Amazon EC2实例上运行配置安全策略(根据亚马逊方向)。任何人都得到了如何测试两台服务器之间连接的指导,或者这可能是问题吗?
IIS连接字符串可能存在问题吗?我没有对此进行测试,但是我们是否应该使用我们连接的计算机名称完全限定服务器(只是想到它)?我们使用格式为server=xxxxx;Database=xxxx;uid=xxxx;password=xxx;
非常感谢您的想法和见解!
提前致谢
答案 0 :(得分:4)
解决。在测试几乎所有可能的性能指标并检查每一段代码之后,我发现错误是由一些不赞成的数据库代码引起的。主要问题是由代码使用:
引起的SqlConnection.ClearPools;
为了将来参考,任何其他想要调试代码和管理连接池的开发人员都可以在这里找到优秀的资源:http://www.codeproject.com/KB/dotnet/ADONET_ConnectionPooling.aspx
答案 1 :(得分:3)
尝试将连接字符串更改为FQDN +端口
server=xxxxx.domain.tld,1234;
注意:如果使用端口
,则不需要任何实例名称在我们的全球企业内部网上...我们遇到了类似的问题,发生在远程客户端:更常见的是如果他们离得更远,从不与服务器在同一栋楼里。
经过一些讨论,与DBA和MS聊天,据说是由时间/ Kerberos /太多防火墙等引起的。添加FQDN +端口删除了我们所有的问题。
答案 2 :(得分:2)
似乎连接没有正确关闭,经过一段时间后你无法打开更多的新连接。由于允许的数据库连接总数是一个固定的数字。
如果您使用的是C#/ VB.net
您是否使用“使用”语句打开连接?
using (System.Data.SqlClient.SqlConnection con = new SqlConnection("YourConnection string"))
{
con.Open();
}
答案 3 :(得分:0)
如果可以,可以通过切换到TCP / IP而不是命名管道来解决。 也许您可以通过将服务器名称更改为服务器IP地址来进行测试。
我在连接字符串中使用server = tcp:servername来强制TCP。 KB313295