Насколько плохо открывать и закрывать SQL-соединение несколько раз?Каков точный эффект?

StackOverflow https://stackoverflow.com/questions/1404261

Вопрос

Например, мне нужно заполнить множество таблиц данных методом Fill() от SqlDataAdapter:

DataAdapter1.Fill(DataTable1);
DataAdapter2.Fill(DataTable2);
DataAdapter3.Fill(DataTable3);
DataAdapter4.Fill(DataTable4);
DataAdapter5.Fill(DataTable5);
....
....

Даже все объекты dataadapter используют одно и то же SqlConnection, каждый метод Fill будет открывать и закрывать соединение, если только состояние соединения не было уже открыто до вызова метода.

Что я хочу знать, так это как ненужное открытие и закрытие SqlConnections влияет на производительность приложения.Насколько сильно его нужно масштабировать, чтобы увидеть негативные последствия этой проблемы (100 000 одновременных пользователей?).На веб-сайте среднего размера (ежедневно 50000 пользователей) стоит ли беспокоиться и искать все вызовы Fill (), сохраняя их вместе в коде и открывая соединение перед любым вызовом Fill () и закрывая после этого?

Это было полезно?

Решение

ADO.NET имеет пул соединений, напримеркогда вы закрываете соединение, оно на самом деле не закрывается полностью, а "перерабатывается", если вы запрашиваете новое соединение с точно такой же строкой подключения.

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

  • открытие соединения
  • считывание всех пяти таблиц данных из базы данных
  • сразу же снова закрываем соединение

Это общепринятая лучшая практика - делать это таким образом, это не причинит вам вреда - так что просто делайте это!:-)

Марк

PS:Пул подключений в ADO.NET конечно, работает только в том случае, если вы его не отключили!:-) Он включен по умолчанию - вам придется явно отключить его.

Другие советы

Ключевой момент:

  • Зачем открывать, сохранять и повторно использовать соединения?

    Производительность

Существует много причин, по которым вы можете захотеть открывать и закрывать соединения.Вы должны решить, где находится наилучший компромисс для твой использовать.Вы можете сделать и то, и другое:используйте открытое соединение в течение определенного периода времени и / или определенного количества транзакций, затем закройте его и откройте новое.

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

Тестовый пример:

Вы можете измерить твой разница заключается в написании двух версий тестового запроса.Выберите любую простую задачу SQL (должна быть то же самое в каждой версии).

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

В второй, делайте это при открытии и закрытии соединения внутри петля.

Измените X количество раз, чтобы соответствовать твой использование и ожидания.Это должно дать вам по-настоящему хорошее представление о влиянии на твой система.

Надеюсь, это поможет вам понять основы...Джек.

NECRO ОТВЕТ: Лучший способ - поместить соединение в оператор «using» так, чтобы оно охватывало всю необходимую работу:

using (SqlConnection conn = new SqlConnection())
{
    DataAdapter1.Fill(DataTable1);
    DataAdapter2.Fill(DataTable2);
    DataAdapter3.Fill(DataTable3);
    DataAdapter4.Fill(DataTable4);
    DataAdapter5.Fill(DataTable5);
    ...
    ...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top