2013-04-06 12 views
23

Ho un'applicazione in asp.net 3.5 e database è di SQL Server 2005.Come risolvere Max Connection Pool errore

"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." 

Qualche tempo questo errore si è verificato Come risolvere questo errore ..

I prova SqlConnection.ClearAllPools(); ma anche questo non funziona.

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

"Timeout scaduto." - Posso pensare a molti motivi per cui si verificherebbe un timeout prima di supporre che hai raggiunto le connessioni massime .... –

+3

Mostraci il tuo codice –

+0

@MitchWheat - È vero, solo il messaggio di errore è chiaro sulle connessioni massime che vengono colpite. – Oded

risposta

14

Verificare le query a lungo termine nel database.

Aumentare la dimensione del pool servirà solo a rendere il vostro webapp vivere un po 'di più (e probabilmente ottenere molto più lento)

È possibile utilizzare profiler di SQL Server e filtrare alla durata/legge per vedere quali querys bisogno di ottimizzazione.

Vedo anche che probabilmente stai mantenendo una connessione globale?

blnMainConnectionIsCreatedLocal 

Consente di effettuare il pooling per voi e di aprire/chiudere la connessione con un'istruzione using.

Suggerimenti:

  1. Sempre aperto e vicino una connessione di questo tipo, in modo da .net possibile gestire le connessioni e non sarà a corto di connessioni:

    using (SqlConnection conn = new SqlConnection(connectionString)) 
        { 
        conn.Open(); 
        // do some stuff 
        } //conn disposed 
    
  2. As Ho accennato, controlla la tua query con il profiler sql server e vedi se è possibile ottimizzarlo. Avere una query lenta con molte richieste in un'app Web può dare anche questi timeout.

+0

pls dammi un suggerimento cosa faccio .. –

+0

Ho aggiornato la mia risposta con alcuni suggerimenti –

+2

Il problema è risolto aumentando il numero massimo dimensione del pool nella stringa di connessione Dimensione max pool = 100 –

6

Può essere questo è un problema di connessione multipla sempre aperta, ci si trova da qualche parte nel codice che apre le connessioni e non le chiude correttamente. utilizzare

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

, consultare questo articolo: http://msdn.microsoft.com/en-us/library/ms254507(v=vs.80).aspx, Il blocco Utilizzando in Visual Basic o C# dismette automaticamente della connessione quando il codice esce dal blocco, anche nel caso di un'eccezione non gestita.

5

Prima di iniziare a maledire la vostra applicazione è necessario controllare questo:

  1. è la vostra applicazione l'unico che utilizza un'istanza di SQL Server. a. Se la risposta è NO, è necessario esaminare il modo in cui le altre applicazioni consumano risorse su SQl Server.run b. Se la risposta è sì, è necessario esaminare la domanda.

  2. Eseguire SQL Server Profiler e verificare quale attività si sta verificando in altre applicazioni (1a) utilizzando SQL Server e controllare anche l'applicazione (1b).

  3. Se davvero la vostra applicazione è affamata di risorse allora è necessario effettuare ulteriori indagini.Per ulteriori continuate a leggere questo http://sqlserverplanet.com/troubleshooting/sql-server-slowness

12

Ecco cosa u può anche provare ....

eseguire l'applicazione .... mentre è ancora in esecuzione avviare il prompt dei comandi

mentre l'applicazione è in esecuzione tipo netstat -n al prompt dei comandi. Dovresti vedere un elenco di connessioni TCP/IP. Controlla se la tua lista non è molto lunga. Idealmente dovresti avere meno di 5 connessioni nell'elenco. Controlla lo stato delle connessioni.
Se si dispone di troppe connessioni con uno stato TIME_WAIT, significa che la connessione è stata chiusa ed è in attesa che il sistema operativo rilasci le risorse. Se si utilizza Windows, la porta temporanea predefinita è compresa tra 1024 e 5000 e il tempo predefinito richiesto a Windows per rilasciare la risorsa dallo stato TIME_WAIT è 4 minuti. Quindi se la tua applicazione utilizzava più di 3976 connessioni in meno di 4 minuti, otterrai l'eccezione che hai ottenuto.

Suggerimenti per risolvere il problema:

  1. Aggiungi un pool di connessioni per la stringa di connessione.

Se si continua a ricevere lo stesso messaggio di errore (che è altamente improbabile) si può quindi provare il seguente: (Si prega di non farlo se non si ha familiarità con il registro di Windows)

  1. Eseguire regedit dal comando di esecuzione. Nel sguardo editor di registro per questa chiave di registro: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters:

modificare le impostazioni in modo che leggono:

MaxUserPort = dword: 00004e20 (10.000 decimali) TcpTimedWaitDelay = dword: 0000001e (30 decimale)

Ciò aumenterà il numero di porte a 10.000 e ridurre il tempo di rilasciare connessioni TCP/iP liberati.

Utilizzare solo il suggerimento 2 se 1 non riesce.

Grazie.

Problemi correlati