我无法让我的应用程序可靠地连接到镜像SQL Server 2008r2。我已经创建了一个工具来帮助诊断问题,并找到了一些有趣的东西。
我正在使用的连接字符串是
Data Source=IADB01;Failover Partner=IBDB01;Database=XXX;
Integrated Security=SSPI;Connection Timeout=150;Pooling=false;
它似乎是非池连接字符串。如果我离开池,我完全没有问题,我可以一秒钟产生几百个连接,没有任何问题。但这会导致自动故障转移出现问题。关闭池,我得到0到100左右的成功连接,然后在最终这个SqlException之前有一个很长的延迟:
System.Data.SqlClient.SqlException (0x80131904): Login failed for user 'INTERNET\71260'.
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover)
at System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover(Boolean useFailoverHost, ServerInfo primaryServerInfo, String failoverHost, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout)
at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance)
at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at DatabaseConnectionTest.Form1.MakeConnection()
ClientConnectionId:dc55aea9-ea36-4812-b628-3dc7f096f0e4
我无法理解这一点,因为我不知道为什么异常登录失败。如果我再次开始连接,我会在登录失败之前获得0到大约100个左右的成功连接。我无法看到在失败之前我获得了多少成功连接的模式,但它通常只有5-10次成功。我们已将客户端转移到与数据库服务器相同的网络交换机上,以避免防火墙等问题,并且它没有改变任何内容。 DC也在同一个开关上。
成功的连接只需不到一秒钟。当连接失败时,它仅在至少5秒后有时达到20秒。我确信问题出在其他地方,但我需要知道在哪里看。
我可以在事件日志中看到SQL Server进行调用,但条目总是相同的。当故障发生时,我在事件日志中得到了相同的一组呼叫。我想在SQL Server上使用分析器来查看,但由于没有sysadmin,我还无法使用。
因此,就堆栈跟踪而言,它看起来就像方法Run和TryRun一样。我该怎么解释这个?实际上已建立连接,但命令失败了吗?谢谢您的帮助。如果需要,我可以发布更多内容。
答案 0 :(得分:0)
排序。这是由TCP烟囱卸载引起的已知问题。解决方案是关闭卸载。