Comment résoudre L'erreur Max Connection Pool

j'ai une application en asp.net 3.5 et la base de données est Sql server 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."

un Certain temps, cette erreur s'est produite Comment résoudre cette erreur..

j'ai essayer SqlConnection.ClearAllPools(); mais cela ne fonctionne pas.

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
demandé sur Harshit Tailor 2013-04-06 11:28:45

4 réponses

vérifiez si votre base de données contient des requêtes en cours d'exécution.

augmenter la taille de votre piscine ne fera que votre webapp vivre un peu plus longtemps (et probablement obtenir beaucoup plus lent)

vous pouvez utiliser sql server profiler et filtrer sur duration / reads pour voir quels querys doivent être optimisés.

je vois aussi que vous gardez probablement une connexion globale?

blnMainConnectionIsCreatedLocal

laisser .net faire la mise en commun pour vous et ouvrir / fermer votre connexion avec une utilisation déclaration.

Suggestions:

  1. Toujours ouvert et fermer une connexion comme celle-ci, donc .net peut 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 générateur de profils sql server et voir si vous pouvez l'optimiser. Avoir une requête lente avec de nombreuses requêtes dans une application web peut donner ces temps morts aussi.

14
répondu Elger Mensonides 2016-05-01 12:14:12

voici ce que vous pouvez aussi essayer....

lancez votre application....pendant qu'il est en cours d'exécution, lancez votre invite de commande

pendant que votre application tourne, tapez netstat-n dans 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érifier l'état des connexions.

Si vous avez trop de connexions avec un statut TIME_WAIT cela signifie que la connexion a été fermée et attend que L'OS libère les ressources. Si vous utilisez Windows, le port éphémère par défaut est compris entre 1024 et 5000 et le temps par défaut que prend Windows pour libérer la ressource de L'état TIME_WAIT est de 4 minutes. Donc, si votre application utilisée plus 3976 connexions en moins de 4 minutes, vous obtiendrez l'exception que vous avez obtenu.

Suggestions pour le corriger:

  1. Ajouter un pool de connexion à votre chaîne de connexion.

Si vous continuez à recevoir le même message d'erreur (ce qui est hautement improbable), vous pouvez essayer ce qui suit: (Merci de ne pas le faire si vous n'êtes pas familier avec le registre de Windows)

  1. Exécuter regedit de votre commande run. Dans l'éditeur du Registre, recherchez cette clé de registre: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters:

modifier le paramètres pour qu'ils lisent:

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

cela augmentera le nombre de ports à 10.000 et réduira le temps de libération des connexions tcp/ip libérées.

utiliser seulement la suggestion 2 Si 1 échoue.

je vous Remercie.

12
répondu Chamu 2013-04-06 13:11:17

C'est peut-être un problème de connexion multiple, vous êtes quelque part dans votre code en train d'ouvrir des connexions et de ne pas les fermer correctement. utilisez

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

Consulter cet article: http://msdn.microsoft.com/en-us/library/ms254507(v=vs. 80).aspx, le bloc D'utilisation dans Visual Basic ou C# dispose automatiquement de la connexion lorsque le code sort du bloc, même dans le cas d'une exception non manipulée.

6
répondu Manoj Purohit 2013-04-06 07:41:20

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

  1. est votre application la seule qui utilise cette instance de SQL Server. A. Si la réponse à cette question est non, alors vous devez examiner comment les autres applications consomment des ressources sur votre serveur SQl.exécuter B. Si la réponse est oui, vous devez examiner votre demande.

  2. exécuter SQL Server Profiler et vérifier quelle activité se passe dans d'autres applications (1a) en utilisant SQL Server et vérifiez votre application ainsi (1b).

  3. si en effet votre application est affamée hors des ressources alors vous devez faire des enquêtes plus approfondies. Pour plus de lecture sur ce http://sqlserverplanet.com/troubleshooting/sql-server-slowness

5
répondu Chamu 2013-04-06 11:39:44