Как я могу решить проблему пула соединения между ASP.NET и SQL Server?

Поскольку вы отметили этот вопрос с помощью sympy, я приведу такой пример.

Из документации: http://docs.sympy.org/latest/modules/plotting. html .

from sympy import var, plot_implicit
var('x y')
plot_implicit(x*y**3 - y*x**3)

188
задан GEOCHET 23 March 2009 в 14:42
поделиться

7 ответов

В большинстве случаев проблемы организации пула подключений связаны с "утечками соединения". Ваше приложение, вероятно, не закрывает свои соединения с базой данных правильно и последовательно. Когда Вы оставляете соединения открытыми, они остаются заблокированными, пока сборщик "мусора".NET не закрывает их для Вас путем вызова их Finalize() метод.

Вы хотите удостовериться, что Вы действительно закрытие соединения . Например, следующий код вызовет утечку соединения, если код между .Open и Close выдаст исключение:

var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();                

корректный путь был бы этим:

var connection = new SqlConnection(ConnectionString);
try
{
     connection.Open();
     someCall (connection);
}
finally
{
     connection.Close();                
}

или

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

, Когда Ваша функция возвраты соединение от метода класса удостоверяются, что Вы кэшируете ее локально и называете Close метод. Вы пропустите соединение с помощью этого кода, например:

var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close(); 

соединение, возвращенное от первого вызова до getConnection(), не закрывается. Вместо того, чтобы закрыть Ваше соединение, эта строка создает новое и попытки закрыть его.

, Если Вы используете SqlDataReader или OleDbDataReader, закройте их. Даже при том, что закрытие самого соединения, кажется, добивается цели, вставляет дополнительное усилие закрыть Ваши объекты средства чтения данных явно при использовании их.

<час>

Эта статья" , Почему Соединение Объединяет Переполнение? " из Журнала MSDN/SQL объясняет много деталей и предлагает некоторые стратегии отладки:

  • Выполнение sp_who или sp_who2. Эти системные хранимые процедуры возвращают информацию из sysprocesses системная таблица, которая показывает состояние и информацию обо всех рабочих процессах. Обычно Вы будете видеть один идентификатор серверного процесса (SPID) для каждого подключения. При именовании соединения при помощи аргумента Имени приложения в строке подключения рабочие соединения будет легко найти.
  • SQL Server Profiler Использования с шаблоном SQLProfiler TSQL_Replay для трассировки открытых соединений. Если Вы знакомы с Профилировщиком, этот метод легче, чем опрос при помощи sp_who.
  • Использование Монитор производительности для контроля пулов и соединений. Я обсуждаю этот метод через мгновение.
  • счетчики производительности Монитора в коде. Можно контролировать здоровье объединения соединения и количество установленных соединений при помощи стандартных программ для извлечения счетчиков или при помощи новой.NET средства управления PerformanceCounter.
194
ответ дан Michael 4 November 2019 в 15:20
поделиться

Я встретился с этой проблемой также при использовании некоторого стороннего слоя данных в одном из моих приложений.NET. Проблема состояла в том, что слой не закрыл соединения правильно.

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

5
ответ дан Wim Haanstra 4 November 2019 в 15:20
поделиться

Можно определить минимальный и максимальный размер пула путем определения MinPoolSize=xyz и/или MaxPoolSize=xyz в строке подключения. Этой причиной проблемы могла быть другая вещь как бы то ни было.

5
ответ дан Mehrdad Afshari 4 November 2019 в 15:20
поделиться

Вы проверяли на DataReaders, которые не закрываются и response.redirects прежде, чем закрыть соединение или datareader. Соединения остаются открытыми, когда Вы не закрываете их перед перенаправлением.

13
ответ дан Ivo 4 November 2019 в 15:20
поделиться

Если Ваше использование не повысилось много, кажется маловероятным, что существует только отставание в работе. IMO, наиболее вероятная опция состоит в том, что что-то использует соединения и не выпускает их быстро. Вы уверены , Вы используете using во всех случаях? Или (через любой механизм) выпуск соединений?

13
ответ дан Marc Gravell 4 November 2019 в 15:20
поделиться

Да, существует способ изменить конфигурацию. Если Вы находитесь на выделенном сервере и просто нуждаетесь в большем количестве соединений SQL, можно обновить "макс. записи" размера пула в обеих строках подключения путем следования этим инструкциям:

  1. Входят в Ваш сервер с помощью Удаленного рабочего стола
  2. , Открывают My Computer (Windows - E) и переходят к C:\inetpub\vhosts[domain]\httpdocs
  3. Double click on the web.config файлу. Это может просто быть перечислено как сеть, если файловая структура установлена скрыть расширения. Это откроет Visual Basic или подобного редактора.
  4. Находят Ваши Строки подключения, они будут выглядеть подобными примерам ниже:

    , "добавляют имя = "SiteSqlServer" connectionString = "сервер = (локальный); database=dbname; uid=dbuser; pwd=dbpassword; pooling=true; соединение lifetime=120; макс. пул size=25"";

5. Изменитесь макс. пул size=X оценивают необходимому размеру пула.

  1. Сохраняют и закрывают Ваш web.config файл.
0
ответ дан 23 November 2019 в 05:31
поделиться

We encounter this problem from time to time on our web site as well. The culprit in our case, is our stats/indexes getting out of date. This causes a previously fast running query to (eventually) become slow and time out.

Try updating statistics and/or rebuilding the indexes on the tables affected by the query and see if that helps.

9
ответ дан 23 November 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: