2009-05-01 10 views
26

4つのWindows 2003マシンのファームに複数のASP.NETアプリケーションが展開されています。各アプリケーションは、IISで個別のアプリケーションプールと仮想ディレクトリを使用します。単一のSQL Server 2000(<sessionstate mode="sqlserver" ... />)に永続化されているセッションに大きく依存しています。アプリケーションは.NET 3.0に対してコンパイルされますが、.NET 3.5 SP1はサーバーにインストールされます。アウトオブプロセスセッション状態を使用するASP.NETアプリケーションでのSQL Serverの接続の問題

各Webサーバーは、約10要求/秒を受信します。すべては、たまに私がログにいくつかの例外を取得:

System.Data.SqlClient.SqlException: A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The semaphore timeout period has expired.) 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() 
    at System.Data.SqlClient.TdsParserStateObject.ReadBuffer() 
    at System.Data.SqlClient.TdsParserStateObject.ReadByte() 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) 
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
    at System.Web.SessionState.SqlSessionStateStore.SetAndReleaseItemExclusive(HttpContext context, String id, SessionStateStoreData item, Object lockId, Boolean newItem) 

または別:

System.Data.SqlClient.SqlException: A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.WriteSni() 
    at System.Data.SqlClient.TdsParserStateObject.WritePacket(Byte flushMode) 
    at System.Data.SqlClient.TdsParserStateObject.ExecuteFlush() 
    at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) 
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
    at System.Web.SessionState.SqlSessionStateStore.SetAndReleaseItemExclusive(HttpContext context, String id, SessionStateStoreData item, Object lockId, Boolean newItem) 

か、まだ別:

System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() 
    at System.Data.SqlClient.TdsParserStateObject.ReadBuffer() 
    at System.Data.SqlClient.TdsParserStateObject.ReadByte() 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 
    at System.Data.SqlClient.SqlDataReader.get_MetaData() 
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader() 
    at System.Web.SessionState.SqlSessionStateStore.DoGet(HttpContext context, String id, Boolean getExclusive, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actionFlags) 

これらのエラーは、数回の日のために起こります約1〜2分の期間が経過し、その後消滅する。誰もこのような問題に遭遇しましたか?問題をさらに追跡するために私が何をすべきだとお考えですか?私にとっては、アプリケーションよりもネットワークの問題に似ています。あまりにも多くの同時接続を処理できないSQL Serverの設定がありますか?どんな提案も大歓迎です。


UPDATE:

私はセッションに格納されているオブジェクトの数や大きさを小さくするために、アプリケーションへのメジャーアップデートを実行することで問題を解決してきました。

答えて

14

多くの場合、トランスポートレベルのエラーは、SQL Serverへの接続が壊れている...通常ネットワークにリンクしています。

タイムアウトSQLクエリの実行に時間がかかりすぎると、タイムアウトが発生します。

Sql Serverへのリンクをトラブルシューティングしてから、どのクエリがタイムアウトしているかを監視します。

SQLジョブのようなサウンドが実行中ですが、バックアップしますか?これは、テーブルをロックしているか、サービスを再起動している可能性があります。

+0

ヒント@Deviantをありがとう。私はこれらを確認し、結果を掲載します。 –

1

接続文字列にCommandTimeout = 120を設定します。 web.configファイルに接続タイムアウトを追加

試してみてください。これが動作するかどうか

<add key="DBConnection" value="server=LocalHost;uid=sa;pwd=;database=DataBaseName;Connect Timeout=200; pooling='true'; Max Pool Size=200"/> 

返信ください....

+9

私はあなたに-1を与えていません。なぜなら、この回答のために人々があなたをマークした理由を知っておくべきだと思うからです。時間切れやプールを増やしても根本的な問題は解決されませんが、このエラーが再び発生した場合にのみ障害の規模が大きくなります。 – Luke

+1

完全に同意しない。 1つのDELETEステートメントで何千もの行を削除するような非常に大きな単一コマンドを実行する必要がある場合は、Commandtimeoutを増やす必要があります。このような状況を避けるためには、通常は問題を再考する必要がありますが、時には、コマンド待ち時間がデフォルトの30秒よりも長くなることがあります。たとえば、http://stackoverflow.com/questions/11747368/set-command-timeout-inentity-framework- 4-3また、ロックのような別の問題を探す必要があります。 –

+2

接続文字列に 'CommandTimeout'(つまり、最大クエリ実行時間)を設定することはできません。接続文字列では、CONNECTIONタイムアウト(つまり、クエリを実行する前に接続を開く最大待機時間)だけを設定できます。 – BateTech

1

それはあなたのクエリの長​​さが超えている場合があります制限65,536 * ネットワークパケットサイズ(デフォルトは4KB)。

+0

これはクエリ結果に適用されますか、またはサーバーに送信するクエリにのみ適用されますか? – paIncrease

4

私の場合、問題はホストのTCP設定(VMWareの仮想マシン)に関連していました。迅速な調査(some article GoogleとMSDN Blogs)私はシステムレジストリでオフにした:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\synattackprotect(0)とHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnableTCPChimney(0)。 これでうまくいきます。もちろんこれはテストマシン(企業ネットワークはインターネットからは見えません)でしたが、私はそれを生産環境では行いません;-)

関連する問題