2013-04-06 28 views
23

Mam aplikacji w ASP.NET 3.5 i baza danych jest serwerem SQL 2005.Jak rozwiązać Max Bilard błąd

"Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached." 

Jakiś czas ten błąd Jak rozwiązać ten problem ..

I spróbuj SqlConnection.ClearAllPools();, ale to też nie działa.

SqlCommand cmdToExecute = new SqlCommand(); 
      cmdToExecute.CommandText = "dbo.[sp_user_listing]"; 
      cmdToExecute.CommandType = CommandType.StoredProcedure; 
      DataTable toReturn = new DataTable("courier_user_listing"); 
      SqlDataAdapter adapter = new SqlDataAdapter(cmdToExecute); 

      // Use base class' connection object 
      cmdToExecute.Connection = sqMainConnection; 

      try 
      { 
       cmdToExecute.Parameters.Add(new SqlParameter("@suser_name", SqlDbType.VarChar, 250, ParameterDirection.Input, true, 0, 0, "", DataRowVersion.Proposed, _user_name)); 


       if (blnMainConnectionIsCreatedLocal) 
       { 
        // Open connection. 
        sqMainConnection.Open(); 
       } 
       else 
       { 
        if (CPMainConnectionProvider.IsTransactionPending) 
        { 
         cmdToExecute.Transaction = CPMainConnectionProvider.CurrentTransaction; 
        } 
       } 

       // Execute query. 
       adapter.Fill(toReturn); 
       i32ErrorCode = (Int32)cmdToExecute.Parameters["@iErrorCode"].Value; 

       if (i32ErrorCode != (int)LLBLError.AllOk) 
       { 
        // Throw error. 
        throw new Exception("Stored Procedure 'sp_courier_user_SelectAll' reported the ErrorCode: " + i32ErrorCode); 
       } 

       return toReturn; 
      } 
      catch (Exception ex) 
      { 
       // some error occured. Bubble it to caller and encapsulate Exception object 
       throw new Exception("Courier_user::SelectAll::Error occured.", ex); 
      } 
      finally 
      { 
       if (blnMainConnectionIsCreatedLocal) 
       { 
        // Close connection. 
        sqMainConnection.Close(); 
       } 
       cmdToExecute.Dispose(); 
       adapter.Dispose(); 
      } 
+0

"Limit czasu wygasł." - Mogę wymyślić wiele powodów, dla których miałby wystąpić limit czasu, zanim założysz, że osiągnąłeś maksymalne połączenia .... –

+3

Pokaż nam swój kod –

+0

@MitchWheat - Prawda, tylko komunikat o błędzie jest jasny na temat maksymalnych połączeń, które zostały trafione. – Oded

Odpowiedz

14

Sprawdź przed długimi uruchomieniami zapytań w bazie danych.

Zwiększenie swoją wielkość puli uczyni tylko Twój webapp żyć trochę dłużej (i prawdopodobnie się dużo wolniej)

Można użyć SQL Server Profiler i filtrować na czas/odczytuje aby zobaczyć, które querys potrzeba optymalizacji.

Widzę również, że prawdopodobnie utrzymujesz globalne połączenie?

blnMainConnectionIsCreatedLocal 

Pozwolić .net wykonać połączenie i otworzyć/zamknąć połączenie za pomocą instrukcji using.

Sugestie:

  1. Zawsze otwarty i blisko połączenie tak, tak .net można zarządzać połączeniami i nie zabraknie połączeń:

    using (SqlConnection conn = new SqlConnection(connectionString)) 
        { 
        conn.Open(); 
        // do some stuff 
        } //conn disposed 
    
  2. As Wspomniałem, sprawdź zapytanie z profilera serwera sql i sprawdź, czy możesz go zoptymalizować. Uwzględnienie powolnego zapytania z wieloma żądaniami w aplikacji internetowej może również dać te limity czasu.

+0

pls daj mi propozycję, co robię .. –

+0

Zaktualizowałem moją odpowiedź z pewnymi sugestiami –

+2

Problem został rozwiązany przez zwiększenie maks. rozmiar basenu w ciągu połączenia Maks. rozmiar basenu = 100 –

6

Może to być problem związany z połączeniem wielokrotnym w trybie alltime, gdzieś w połączeniach otwierających kod i nie zamyka się ich poprawnie. używać

using (SqlConnection con = new SqlConnection(connectionString)) 
     { 
      con.Open(); 
     } 

Patrz artykuł: http://msdn.microsoft.com/en-us/library/ms254507(v=vs.80).aspx, bloku Using Visual Basic lub C# automatycznie pozbywa połączenia, gdy kod wyjście z bloku, nawet w przypadku nieobsługiwany wyjątek.

5

Zanim zaczniesz przeklinać swoją aplikację trzeba sprawdzić to:

  1. Czy aplikacja jedynym użyciu tego wystąpienie SQL Server. a. Jeśli odpowiedź na to pytanie brzmi NIE, należy sprawdzić, w jaki sposób inne aplikacje zużywają zasoby na serwerze SQl Server.run b. Jeśli odpowiedź brzmi "tak", musisz zbadać swoją aplikację.

  2. Uruchom program SQL Server Profiler i sprawdź, co dzieje się w innych aplikacjach (1a) przy użyciu programu SQL Server i sprawdź również swoją aplikację (1b).

  3. Jeśli rzeczywiście Twoja aplikacja jest pozbawiona zasobów, musisz przeprowadzić dalsze dochodzenia.Na więcej czytaj na tej http://sqlserverplanet.com/troubleshooting/sql-server-slowness

12

Oto co u można także spróbować ....

uruchomić aplikację .... gdy jest on nadal działa uruchomić wiersz polecenia

podczas aplikacji jest uruchomiony w wierszu polecenia: wpisz netstat -n. Powinieneś zobaczyć listę połączeń TCP/IP. Sprawdź, czy twoja lista nie jest zbyt długa. Idealnie powinieneś mieć mniej niż 5 połączeń na liście. Sprawdź status połączeń.
Jeśli masz zbyt wiele połączeń ze statusem TIME_WAIT, oznacza to, że połączenie zostało zamknięte i oczekuje na zwolnienie zasobów przez system operacyjny. Jeśli używasz systemu Windows, domyślny port efemeryczny zadzwoni między 1024 a 5000, a domyślny czas, w którym system Windows ma zwolnić zasób ze stanu TIME_WAIT, wynosi 4 minuty. Więc jeśli twoja aplikacja użyje więcej niż 3976 połączeń w mniej niż 4 minuty, dostaniesz wyjątek, który masz.

Sugestie go naprawić:

  1. Dodaj puli połączeń do ciągu połączenia.

Jeśli nadal pojawia się ten sam komunikat o błędzie (co jest mało prawdopodobne) można następnie spróbuj wykonać następujące czynności: (proszę nie rób tego, jeśli nie są zaznajomieni z rejestru Windows)

  1. Uruchom regedit z komendy uruchamiania. W wyglądzie edytor rejestru dla tego klucza rejestru: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters:

zmodyfikować ustawienia tak czytają:

MaxUserPort = dword: 00004e20 (10000 przecinku) TcpTimedWaitDelay = dword: 0000001e (30 dziesiętnie)

To zwiększy liczbę portów do 10000 i skrócić czas do uwolnienia uwolnione połączenia TCP/iP.

Używaj sugestii 2 tylko w przypadku niepowodzenia 1.

Dziękuję.

Powiązane problemy