我无法让我的应用程序可靠地连接到镜像 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 上使用探查器来查看,但由于没有系统管理员,我还无法查看。
因此,就堆栈跟踪而言,它看起来就像方法 Run 和 TryRun 一样。我该如何解释这个?实际上已经建立了连接,但是命令失败了?谢谢您的帮助。如果需要,我可以发布更多。