2

最近我发现从我们的一个网络服务器到 MSSQL AlwaysOn 侦听器的连接失败了。侦听器有两个 IP 地址,因为它跨越子网,因此我们在连接字符串中指定 Multisubnetfailover=true。

尝试与侦听器建立连接时,出现以下错误:

System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired.  The timeout period elapsed while
attempting to consume the pre-login handshake acknowledgement.  This could be because the pre-login handshake
failed or the server was unable to respond back in time.  The duration spent while attempting to connect to this
server was - [Pre-Login] initialization=20991; handshake=0;  ---> System.ComponentModel.Win32Exception     
(0x80004005): The wait operation timed out at     
System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32     
waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions     
userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 
retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, 
TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, 
DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, 
DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, 
DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at IRNXMLGateway.Controllers.IRNXMLGatewayController.GenericCall(String methodCall) in 
CODELINE:line 376
ClientConnectionId:92074b33-176a-4006-b7c7-892e01a3eea7

我也尝试使用 SSMS 连接并遇到相同的超时问题。

我能够通过以下方式成功建立连接:

  • 无需监听器直接连接到主机
  • 直接连接到当前监听 IP 地址
  • 将连接超时增加到 200 秒
  • 删除连接字符串中的 MultiSubnetFailover 选项

尝试从其他服务器连接时,我没有遇到此问题。SQL 或 Windows 事件日志中没有错误,可帮助确定超时的原因。网络跟踪显示与当前侦听器 IP 地址的正确连接握手。两台服务器都没有启用防火墙或防病毒软件。Webserver 运行 server 2008 web edition,SQL server 运行 windows server 2012 和 sql server 2012。

4

4 回答 4

0

以下是否属实:您有一个安装在客户端应用程序工作站上的活动传输驱动程序接口 (TDI) 筛选器驱动程序。

如果是这样,MS 上有一篇关于此问题的知识库文章。
http://support.microsoft.com/kb/2870437

于 2014-05-01T21:51:26.673 回答
0

所以“我认为”我能够解决这个问题。我重新安装了 .NET 4.5 并重新启动了服务器,现在可以毫无问题地建立连接。我目前的想法是,最初安装 4.5 的人没有跟进所需的系统重新启动,从而使事情处于奇怪的状态。我将继续监视此服务器几周,以查看问题是否再次出现。对于可能导致此问题的任何其他意见,我仍然很感激。

于 2014-05-02T19:56:34.660 回答
0

因此,我们最近遇到了完全相同的情况,并且似乎与 2014 年 9 月 MS 周二发布的补丁相吻合。作为临时修复,我将“活动”侦听器 IP 放入 hosts 文件中,以便它始终在本地解析并且一切正常。我想我也可以删除故障转移集群中的第二个 IP。

Telnet 似乎确认在连接到侦听器时需要 21 秒才能超时,这与侦听器 IP 的串行 DNS 查找相匹配并获得“错误的”。仍在寻找最终答案,但肯定会尝试重新安装 4.5 .NET,因为我读到 .NET 库在 15 秒后超时,因此 DNS 永远没有机会将第二个 IP 发送到客户端。

于 2014-10-07T12:56:31.977 回答
0

这是一个客户端问题。我刚刚在基于 Windows 7 客户端的应用程序的 Sql 2012 上发生了这种情况。你之前得到的关于知识库文章的建议是正确的。它最初是由 Microsoft 工程师提供给我的,用于纠正我们的问题。

If yours is the same issue, you can create a test app that loops a connection. Set the connection timeout = 6000 and display a loop counter. You will see it hesitate initially and then zoom through the iterations.

Install the recommended KB hotfix.

Rerun the test app ands you should see no hesitation at all.

于 2014-10-08T21:01:04.710 回答