SqlConnection в .NET - Как лучше всего использовать пул соединений?

2

Я читал, что .NET использует пул соединений.

Например, если я создаю кучу объектов SqlConnection с той же строкой соединения, то внутри .NET будет знать, что использовать одно и то же соединение.

Это правильно?

Кроме того, в большом веб-приложении есть советы по наилучшему способу использования этой "мощности"?

Теги:
sql-server
sql-server-2005

3 ответа

13
Лучший ответ

Настройка TCP-соединения между вашим веб-приложением и SQL Server может быть дорогостоящей операцией. Пул соединений позволяет повторно использовать соединения с базой данных для последующих запросов данных. Вместо того, чтобы настраивать новое TCP-соединение для каждого запроса, новое соединение настраивается только тогда, когда оно не доступно в пуле соединений. Когда соединение закрыто, оно возвращается в пул, где он остается подключенным к базе данных, а не полностью срывает это TCP-соединение.

Всегда закрывайте соединения, когда вы закончите с ними. Независимо от того, что кто-либо говорит о сборе мусора в Microsoft.NET Framework, всегда вызывайте Close или Dispose явно в своем соединении, когда вы закончите с ним. Не доверяйте среде CLR, чтобы очистить и закрыть ваше соединение. CLR в конечном итоге уничтожит класс и закроет соединение, но у вас нет гарантии, когда сбор мусора на объекте действительно произойдет.

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

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

http://msdn.microsoft.com/en-us/magazine/cc163854.aspx

  • 2
    @ Роберт, отличный ответ, но я хотел бы, чтобы вы добавили пример быстрого кода, показывающий выражение «с помощью», чтобы открыть (а затем и Уничтожить) соединение.
9

Если вы используете следующий синтаксис, когда когда-либо останется блок использования, будет вызываться метод dispose, даже если возникает исключение.

using(SqlConnection connection = new SqlConnection())
{
    // Work with connection object here.
}

//connection object gets disposed here.
2

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

когда у вас есть SQLConnection, позвоните ему conn и вы сделаете следующее:

conn.Open();

а затем вы выполняете некоторый оператор SQL, будь то выбор, вставка или обновление. вполне возможно, что он потерпит неудачу. Поэтому, конечно, вы должны это сделать:

try { conn.Open() } 
catch (SqlException ex) 
 { 
       //do your logging/exception handling 
 }

однако люди забывают добавить блок finally.

finally {
       if (conn.State == System.Data.ConnectionState.Open)
         conn.Close();
}

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

  • 7
    Предпочтительным способом является использование conn в операторе using () {}. Работает с или без объединения.
  • 0
    согласен, но зачем вам проверять, открыто ли соединение, прежде чем его закрывать? почему бы не закрыть его в любом случае, я уверен, что это не ошибка.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню