Подтвердить что ты не робот

Как решить ошибку пула подключения

У меня есть приложение в asp.net 3.5, а база данных - сервер 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."

Некоторое время эта ошибка возникла. Как решить эту ошибку.

Я пытаюсь SqlConnection.ClearAllPools();, но это тоже не работает.

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();
            }
4b9b3361

Ответ 1

Откажитесь от любых длинных запросов в вашей базе данных.

Увеличение размера вашего пула приведет к тому, что ваш webapp будет жить немного дольше (и, вероятно, будет намного медленнее)

Вы можете использовать профилировщик sql-сервера и фильтровать по длительности/чтениям, чтобы увидеть, какие запросы требуют оптимизации.

Я также вижу, что вы, вероятно, поддерживаете глобальное соединение?

blnMainConnectionIsCreatedLocal

Пусть .net выполняет объединение для вас и открывает/закрывает ваше соединение с помощью оператора using.

Предложения:

  • Всегда открывайте и закрывать соединение, подобное этому, так что .net может управлять вашими подключениями, и вы не закончите соединение:

        using (SqlConnection conn = new SqlConnection(connectionString))
        {
         conn.Open();
         // do some stuff
        } //conn disposed
    
  • Как я уже упоминал, проверьте свой запрос с помощью sql server profiler и посмотрите, можете ли вы его оптимизировать. Наличие медленного запроса со многими запросами в веб-приложении также может дать эти таймауты.

Ответ 2

Здесь вы можете также попробовать...

запустите ваше приложение... пока он все еще запускает вашу командную строку

пока ваше приложение запускает тип netstat -n в командной строке. Вы должны увидеть список соединений TCP/IP. Проверьте, не слишком ли длинный список. В идеале у вас должно быть менее 5 подключений в списке. Проверьте состояние соединений.
Если у вас слишком много соединений с статусом TIME_WAIT, это означает, что соединение было закрыто и ожидает освобождения ОС. Если вы работаете в Windows, эфемерный порт по умолчанию составляет от 1024 до 5000, а по умолчанию для Windows требуется освободить ресурс из статуса TIME_WAIT - 4 минуты. Поэтому, если ваше приложение использует более 3976 подключений менее чем за 4 минуты, вы получите исключение, которое вы получили.

Предложения по исправлению:

  • Добавьте пул соединений в строку подключения.

Если вы продолжаете получать то же сообщение об ошибке (что маловероятно), вы можете попробовать следующее: (не делайте этого, если вы не знакомы с реестром Windows)

  • Запустите regedit из вашей команды запуска. В редакторе реестра найдите этот раздел реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters:

Измените настройки, чтобы они читали:

MaxUserPort = dword: 00004e20 (10 000 знаков после запятой) TcpTimedWaitDelay = dword: 0000001e (30 десятичных знаков)

Это увеличит количество портов до 10 000 и уменьшит время освобождения освобожденных подключений tcp/ip.

Используйте только предложение 2, если 1 не удается.

Спасибо.

Ответ 3

Может быть, это проблема с открытием многократного подключения, вы находитесь где-то в своих открытиях кода и не закрываете их должным образом. используйте

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

Обратитесь к этой статье: http://msdn.microsoft.com/en-us/library/ms254507(v=vs.80).aspx, Блок использования в Visual Basic или С# автоматически удаляет соединение, когда код выходит из блока, даже в случай необработанного исключения.

Ответ 4

Прежде чем вы начнете проклинать свое приложение, вам необходимо проверить это:

  • Является ли ваше приложение единственным, использующим этот экземпляр SQL Server. а. Если ответ на этот вопрос НЕТ, вам нужно выяснить, как другие приложения потребляют ресурсы на вашем сервере SQl.run б. Если ответ "да", вы должны изучить ваше выражение.

  • Запустите Профилировщик SQL Server и проверьте, что происходит в других приложениях (1a) с помощью SQL Server и проверьте приложение (1b).

  • Если ваша заявка отключена от ресурсов, вам необходимо провести дальнейшие расследования. Подробнее об этом http://sqlserverplanet.com/troubleshooting/sql-server-slowness