0

アプリケーションをミラー化された SQL Server 2008r2 に確実に接続するのに問題があります。問題の診断に役立つツールを作成したところ、興味深いことがいくつか見つかりました。

私が使用している接続文字列は

Data Source=IADB01;Failover Partner=IBDB01;Database=XXX;
Integrated Security=SSPI;Connection Timeout=150;Pooling=false;

プールされていない接続文字列のようです。プールをオンのままにしておくと、まったく問題が発生せず、1 秒間に数百の接続を問題なく生成できます。ただし、これにより自動フェイルオーバーで問題が発生します。プーリングをオフにすると、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 も同じスイッチにあります。

成功した接続には 1 秒もかかりません。接続が失敗すると、少なくとも 5 秒後、場合によっては最大 20 秒後に失敗します。問題は別の場所にあると確信していますが、どこを見ればよいかアイデアが必要です。

イベント ログで SQL Server が呼び出しを行っていることがわかりますが、エントリは常に同じです。障害が発生すると、イベント ログに同じ一連の呼び出しが記録されます。SQL Server でプロファイラーを使用して確認したいのですが、sysadmin がないため、まだできていません。

ということで、スタックトレースを見る限り、RunとTryRunのメソッドまではできているようです。これをどのように解釈すればよいでしょうか。接続は実際に確立されていますが、コマンドは失敗していますか? 助けてくれてありがとう。必要に応じてさらに投稿できます。

4

1 に答える 1

0

並べ替えました。これは、TCP Chimney Offloading によって引き起こされる既知の問題です。解決策は、オフロードをオフにすることです。

于 2013-10-17T08:41:03.670 に答える