2009-05-01 10 views
26

Mam kilka aplikacji ASP.NET wdrożonych w farmie 4 komputerów z systemem Windows 2003. Każda aplikacja używa oddzielnej puli aplikacji i katalogu wirtualnego w usługach IIS. Opierają się one w dużej mierze na sesjach, które są przechowywane na jednym serwerze SQL Server 2000 (<sessionstate mode="sqlserver" ... />). Aplikacje są kompilowane na .NET 3.0, ale .NET 3.5 SP1 jest instalowany na serwerach.Problemy z połączeniem z programem SQL Server w aplikacjach ASP.NET używających stanu sesji poza procesem

Każdy serwer sieciowy otrzymuje około 10 żądań na sekundę. Raz na jakiś czas mam pewne wyjątki w kłody:

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) 

lub innego:

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) 

albo jeszcze innego:

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) 

błędy te pojawiają się kilka razy dziennie przez około 1-2 minuty, a następnie znikają. Czy ktoś napotkał takie problemy? Co możesz mi zasugerować, aby dalej śledzić problem? Dla mnie wygląda bardziej jak problemy z siecią niż aplikacja. Czy mogą to być niektóre ustawienia na Serwerze SQL, które nie obsługują tylu współbieżnych połączeń? Wszelkie sugestie będą bardzo mile widziane.


UPDATE:

mam rozwiązać ten problem, wykonując główne aktualizacje do zastosowania w celu zmniejszenia liczby i wielkości obiektów przechowywanych w sesji.

Odpowiedz

14

Błędy poziomu transportu są często powiązane z połączeniem z uszkodzonym serwerem sql ... zwykle siecią.

Limit czasu wygasł jest zwykle zgłaszany, gdy kwerenda sql trwa zbyt długo.

Więc chciałbym rozwiązać problem z linkiem do twojego serwera SQL, a następnie monitorować, aby sprawdzić, które zapytania kończą się.

Brzmi jak zadanie SQL jest uruchomione, tworzenie kopii zapasowych? Może to być blokowanie tabel lub ponowne uruchamianie usługi.

+0

Dzięki za porady @Deviant. Sprawdzę je i opublikuję wyniki. –

1

Ustaw CommandTimeout = 120 w ciągu połączenia.

Spróbuj dodać Połącz Timeout w pliku web.config:

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

odpowiedz czy to działa ....

+9

Nie dałem ci minus -1, ponieważ uważam, że powinieneś wiedzieć, dlaczego ludzie cię wyznaczyli dla tej odpowiedzi. Zwiększenie limitu czasu lub nawet puli nie rozwiąże podstawowego problemu, zwiększy to skalę awarii, jeśli błąd wystąpi ponownie. – Luke

+1

Nie zgadzam się całkowicie. Jeśli naprawdę potrzebujesz wykonać bardzo dużą pojedynczą komendę, taką jak usuwanie tysięcy wierszy w pojedynczej instrukcji DELETE, musisz wydłużyć czas oczekiwania. Normalnie powinieneś przemyśleć problem, aby uniknąć tego rodzaju sytuacji, ale czasami potrzebujesz czasu oczekiwania w Commandtimeout wyższego niż domyślne 30 sekund, jak na http://stackoverflow.com/questions/11747368/set-command-timeout-in-entity-framework- 4-3 Powinieneś także poszukać innego problemu, na przykład blokad ... –

+2

Nie możesz ustawić 'CommandTimeout' (tj. Maksymalnego czasu wykonania zapytania) w ciągu połączenia. W ciągu połączenia można ustawić tylko limit czasu CONNECTION (tj. Maksymalny czas oczekiwania na otwarcie połączenia, czyli przed wykonaniem dowolnego zapytania). – BateTech

1

To może być sprawa, w której długość przekracza zapytania ograniczenie 65 536 * Rozmiar pakietu sieciowego (domyślnie 4 KB).

+0

ma to zastosowanie do wyników kwerendy lub tylko do kwerendy wysyłać do serwera? – paIncrease

4

W moim przypadku problem był związany z konfiguracją TCP hosta (maszyna wirtualna w VMWare). Po szybkich badaniach (some article znalezionych w Google i MSDN Blogs) wyłączyłem w rejestrze systemowym: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\synattackprotect (0) i HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnableTCPChimney (0). Teraz działa dobrze. Oczywiście była to tylko maszyna testowa (sieć firmowa niewidoczna z Internetu) i nie zrobiłbym tego w środowisku produkcyjnym ;-)

Powiązane problemy