SqlConnection в .NET - Как лучше всего использовать пул соединений? - PullRequest
2 голосов
/ 27 июня 2009

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

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

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

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

Ответы [ 3 ]

13 голосов
/ 27 июня 2009

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

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

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

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

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

9 голосов
/ 27 июня 2009

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

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

//connection object gets disposed here.
2 голосов
/ 27 июня 2009

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

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

conn.Open();

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

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

однако, люди забывают добавить блок Наконец.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...