Открытое соединение перед каждым отдельным запросом или одно соединение для целого? - PullRequest
1 голос
/ 28 декабря 2011

Если у меня около 2000 record и я делаю многократную вставку. Какой метод имеет лучшую производительность, чем другой?

  • соединение с каждой отдельной вставкой. И закрытие после вставки.
  • одно соединение для всей массы и закрыть соединение на конец. и как насчет тайм-аута соединения в этом случае.

Примечания :

  • База данных - informix db.

  • Для вставки около 6000 записей требуется от 3,5 до 4 минут. (С первый метод)

Ответы [ 3 ]

2 голосов
/ 28 декабря 2011

Недавно я немного повозился с очень похожей ситуацией. У меня было приложение, которое вставляло бы от 1 до нескольких тысяч записей в базу данных MySQL.

Чтобы продемонстрировать (для себя) поведение пула соединений, описанное Магнусом в его ответе, вы можете быстро создать приложение. С помощью кнопки и события click откройте (а затем .close ()) соединение с вашей базой данных, затем нажмите кнопку, чтобы «повторно открыть» соединение несколько раз после этого. (Обязательно предоставьте некоторую обратную связь, чтобы знать, когда (и если) .open () успешно.) Вы заметите, что первоначальное соединение занимает несколько секунд, но последующие попытки очень быстрые, когда соединение извлекается из пула.

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

1 голос
/ 28 декабря 2011

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

Тем не менее, то, что я делаю, соответствует следующему правилу:

Если вы можете открыть соединение и затем выполнить несколько операций, используя синтаксис «using»:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    // Do work here; connection closed on following line.
}

Затем оставьте соединение открытым и выполните все операции.

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

Из MSDN:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx

Для развертывания высокопроизводительных приложений необходимо использовать пул соединений. Когда вы используете поставщик данных .NET Framework для SQL Server, вам не нужно включать пул соединений, потому что поставщик управляет этим автоматически, хотя вы можете изменить некоторые параметры. Для получения дополнительной информации см. Пул соединений с SQL Server (ADO.NET).

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

1 голос
/ 28 декабря 2011

Поведение соединения по умолчанию заключается в том, что оно добавляется в пул.Таким образом, когда Close() в вызываемом, оно на самом деле не закрывается, а просто передается в пул, а когда Open() вызывается для нового соединения, из пула выбирается существующее открытое соединение.
Если пул отключен с открытымсоединение во время полной вставки предпочтительнее закрытия после каждой вставки.

...