Насколько плохо открывать и закрывать SQL-соединение несколько раз?Каков точный эффект?
-
05-07-2019 - |
Вопрос
Например, мне нужно заполнить множество таблиц данных методом 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);
...
...
}