Пул подключений

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

Последнее обновление: 31.10.2015

Как правило, в программе используется одна или несколько одних и тех же конфигураций подключений. И чтобы разработчику не приходилось создавать по нескольку раз в коде программы фактически одно и тоже подключение, в ADO.NET используется механизм пула подключений. К тому же сама по себе операция создания нового объекта подключений является довольно затратной, и использование пула позволяет оптимизировать производительность приложения.

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

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

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

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

SqlConnection connection;
connection = new SqlConnection(connectionString);
            
connection.Open();
Console.WriteLine(connection.ClientConnectionId);
connection.Close();

connection.Open();
Console.WriteLine(connection.ClientConnectionId);
connection.Close();

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

Все подключения в пуле различаются по нескольким признакам:

  • строка подключения

  • учетные записи, используемые при подключении

  • процесс приложения

В следующем примере в первых двух блоках using будет использоваться одно и то же подключение из пула, поскольку строка подключения будет совпадать:

string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
string connectionString2 = @"Data Source=.\SQLEXPRESS;Initial Catalog=players;Integrated Security=True";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open(); // создается первый пул
    Console.WriteLine(connection.ClientConnectionId);
}
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open(); // подключение извлекается из первого пула
    Console.WriteLine(connection.ClientConnectionId);
}
using (SqlConnection connection = new SqlConnection(connectionString2))
{
    connection.Open(); // создается второй пул, т.к. строка подключения отличается
    Console.WriteLine(connection.ClientConnectionId);
}

Если параметр Min Pool Size не указан в строке подключения или его значение равно 0, то подключения в пуле будут закрыты после периода отсутствия активности (4-8 минут), либо если разорвана связь с сервером базы данных. Но если значение параметра Min Pool Size больше 0, пул подключений не удаляется, пока не будет выгружен домен приложения AppDomain и не завершится процесс.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850