2009-10-15 2 views
2

я наткнулся на article о том, что с помощью моего SqlConnection так:Каковы последствия эффективности использования «Использование» на sqlConnections

using (SqlConnection sqlConnection = new SqlConnection(Config.getConnectionString())) 
      { 
       using (SqlDataAdapter dataAdapter = new SqlDataAdapter(query, sqlConnection)) 
       { 
        dataAdapter.Fill(dataSet); 
       } 
      } 

повышает производительность, поскольку она располагает объектами в конце вашего метода. Поэтому я уже некоторое время программировал «Использование», после общения с некоторыми другими разработчиками они сказали, что создание и уничтожение экземпляра несколько раз не приведет к повышению производительности.

Каковы последствия для производительности для sqlserver и системных ресурсов, если я использую «Использование» для всех моих методов dataAccess. Будет ли sqlServer ударяться сильнее из-за того, что соединение подключено и повторно подключено несколько раз?

ответ

12

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

Итак, да: он может улучшить всего производительность.

Альтернативы:

  • , если ваш код выходит чисто, и вы всегда помните Close() связь, то, возможно, никакой разницы
  • если ваш код сгенерирует исключение (что вы не обрабатываются), или вы забудьте указать на Close() соединение, после чего вы можете покинуть неиспользуемые соединения, пока вокруг не будет достаточного давления памяти, чтобы запустить GC и финализатор. Это может означать, что вам нужно больше физические подключения к серверу SQL (боль), и каждый раз, когда требуется нового базовое соединения он должен принять удар по производительности установления фактического подключение к базе данных

Общих , хотя - подумайте о IDisposable в качестве контракта; это ваше job как разработчик .NET, чтобы заметить IDisposable ресурсов и активно Dispose() их, когда вы закончите, в идеале с using, если использование сильно ограничено (как в этом случае).

3

В большинстве случаев он не оказывает существенного влияния на характеристики.

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

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

Я бы проголосовал за использование подхода using() {...} в 100% случаев - это чище, это безопаснее, это просто лучшая практика программирования. Эффект «удар», который вы можете взять, является незначительным и не стоит проблем. включен

Marc

0

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

0

ADO.NET имеет такую ​​функцию, как объединение пулов, поэтому, если вы интенсивно открываете соединения, скорее всего, соединение не будет удалено, только возвращается в пул.

0

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

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

0

есть улучшение производительности.

если вы используете using

например:

using (SqlConnection sqlConnection = new SqlConnection("ConnectionString")) 
    { 
    } 

компилятор автоматически добавляет попробовать и, наконец.

alt text http://img111.imageshack.us/img111/4514/using.jpg

+0

Я не понимаю, как это переводит к улучшению производительности. Безопасность и удобочитаемость, конечно. –

Смежные вопросы