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

Например, мне нужно заполнить множество таблиц DataTable с помощью метода Fill() SQLDataAdapter:

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

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

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


person Eren    schedule 10.09.2009    source источник


Ответы (3)


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

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

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

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

Марк

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

person marc_s    schedule 10.09.2009

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

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

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

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

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

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

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

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

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

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

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

person Jack Knows Jack    schedule 02.06.2010

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

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