Насколько плохо открытие и закрытие соединения SQL несколько раз? Каков точный эффект? - PullRequest
3 голосов
/ 10 сентября 2009

Например, мне нужно заполнить множество DataTables методом 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 (), а затем закрывать?

Ответы [ 3 ]

9 голосов
/ 10 сентября 2009

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

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

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

Лучше всего поступать так, это не повредит вам - просто сделайте это! :-)

Марк

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

1 голос
/ 03 июня 2010

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

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

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

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

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

Контрольный пример:

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

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

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

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

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

0 голосов
/ 05 октября 2017

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

using (SqlConnection conn = new SqlConnection())
{
    DataAdapter1.Fill(DataTable1);
    DataAdapter2.Fill(DataTable2);
    DataAdapter3.Fill(DataTable3);
    DataAdapter4.Fill(DataTable4);
    DataAdapter5.Fill(DataTable5);
    ...
    ...
}
...