web-dev-qa-db-fra.com

Comment résoudre l'erreur de pool de connexions max

J'ai une application dans asp.net 3.5 et la base de données est le serveur SQL 2005.

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

Quelque temps cette erreur s'est produite Comment résoudre cette erreur ..

J'essaie SqlConnection.ClearAllPools(); mais cela ne fonctionne pas non plus.

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();
            }
23
Harshit Tailor

Vérifiez les requêtes de longue durée dans votre base de données.

L'augmentation de la taille de votre pool ne fera que rendre votre application web un peu plus longue (et probablement beaucoup plus lente)

Vous pouvez utiliser le profileur de serveur SQL et filtrer sur la durée/les lectures pour voir quelles requêtes doivent être optimisées.

Je vois aussi que vous gardez probablement une connexion mondiale?

blnMainConnectionIsCreatedLocal

Laissez .net faire le regroupement pour vous et ouvrez/fermez votre connexion avec une instruction using.

Suggestions:

  1. Toujours ouvrir et fermer une connexion comme celle-ci, afin que .net puisse gérer vos connexions et vous ne manquerez pas de connexions:

        using (SqlConnection conn = new SqlConnection(connectionString))
        {
         conn.Open();
         // do some stuff
        } //conn disposed
    
  2. Comme je l'ai mentionné, vérifiez votre requête avec sql server profiler et voyez si vous pouvez l'optimiser. Avoir une requête lente avec de nombreuses demandes dans une application Web peut également donner ces délais.

14
Elger Mensonides

Voici ce que vous pouvez également essayer ....

exécutez votre application .... alors qu'elle est toujours en cours d'exécution lancez votre invite de commande

pendant que votre application est en cours d'exécution, tapez netstat -n sur l'invite de commande. Vous devriez voir une liste des connexions TCP/IP. Vérifiez si votre liste n'est pas très longue. Idéalement, vous devriez avoir moins de 5 connexions dans la liste. Vérifiez l'état des connexions.
Si vous avez trop de connexions avec un état TIME_WAIT, cela signifie que la connexion a été fermée et attend que le système d'exploitation libère les ressources. Si vous utilisez Windows, le port éphémère par défaut se situe entre 1024 et 5000 et le temps par défaut qu'il faut à Windows pour libérer la ressource du statut TIME_WAIT est de 4 minutes. Donc, si votre application a utilisé plus de 3976 connexions en moins de 4 minutes, vous obtiendrez l'exception que vous avez obtenue.

Suggestions pour y remédier:

  1. Ajoutez un pool de connexions à votre chaîne de connexion.

Si vous continuez à recevoir le même message d'erreur (ce qui est très peu probable), vous pouvez alors essayer ce qui suit: (veuillez ne pas le faire si vous n'êtes pas familier avec le registre Windows)

  1. Exécuter regedit à partir de votre commande d'exécution. Dans l'éditeur de registre, recherchez cette clé de registre: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters:

Modifiez les paramètres pour qu'ils lisent:

MaxUserPort = dword: 00004e20 (10 000 décimal) TcpTimedWaitDelay = dword: 0000001e (30 décimal)

Cela augmentera le nombre de ports à 10 000 et réduira le temps nécessaire pour libérer les connexions TCP/IP libérées.

N'utilisez la suggestion 2 que si 1 échoue.

Merci.

12
Chamu

Il se peut que ce soit un problème ouvert de connexion multiple, vous êtes quelque part dans votre code qui ouvre des connexions et ne les ferme pas correctement. utilisation

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

Reportez-vous à cet article: http://msdn.Microsoft.com/en-us/library/ms254507 (v = vs.80) .aspx , Le bloc Using en Visual Basic ou C # supprime automatiquement la connexion lorsque le code quitte le bloc, même dans le cas d'une exception non gérée.

6
Manoj Purohit

Avant de commencer à maudire votre application, vous devez vérifier ceci:

  1. Votre application est-elle la seule à utiliser cette instance de SQL Server. une. Si la réponse est NON, vous devez rechercher comment les autres applications consomment des ressources sur votre SQl Server.run b. Si la réponse est oui, vous devez enquêter sur votre candidature.

  2. Exécutez SQL Server Profiler et vérifiez quelle activité se produit dans d'autres applications (1a) à l'aide de SQL Server et vérifiez également votre application (1b).

  3. Si, en effet, votre application est privée de ressources, vous devez effectuer des investigations plus poussées. Pour plus d'informations à ce sujet http://sqlserverplanet.com/troubleshooting/sql-server-slowness

5
Chamu