Пулы соединений Postgres Npgsql с кодом

Я знаю об этом сообщении: Postgres Npgsql Connection Pooling Но это не полностью решило мою проблему .

Я концептуально понимаю, как работают пулы соединений, но я изо всех сил пытаюсь понять, как применять их в моем приложении .NET с помощью Npgsql.

Вот что я сейчас делаю:

NpgsqlConnectionStringBuilder cb ...    // build command and set properties
cb.Pool = True                         // set pool setting to True and set max pool

NpgsqlConnection conn =  new NpgsqlConnection(cb.ConnectionString)

public void thread1()
    NpgsqlCommand cmd = new NpgsqlCommand(conn)
    cmd.Connection.Open()
    // code
    cmd.ExecuteNonQuery
    
    cmd.Connection.Close()

public void thread2() {
    //... same thing
}

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

Что происходит, когда я делаю NpgsqlConnection.Open() (он же conn.Open()) против cmd.Connection.Open()?

Я чувствую, что есть что-то основное, чего я не понимаю.


person Astupidhippo    schedule 21.04.2021    source источник
comment
См.: docs.microsoft.com/ en-us/dotnet/framework/data/adonet/   -  person jdweng    schedule 22.04.2021
comment
каждый раз, когда я делаю новую команду — нет, всякий раз, когда вы создаете новое соединение, оно может взять одно из пула, если оно доступно. Это пул соединений, а не пул команд. Вы неправильно поняли пул соединений. Вы можете создавать объекты локальных переменных NpgsqlConnection сколько хотите, и вы должны это делать, если вы также правильно их размещаете (читай: using блоков). Вы не должны касаться cmd.Connection напрямую. Объект подключения и базовое соединение (сокет, именованный канал и т. д.) — это не одно и то же, и это базовое соединение объединяется в пул.   -  person madreflection    schedule 22.04.2021
comment
@madreflection Спасибо за ваше объяснение. Поэтому каждый раз, когда я создаю новый объект подключения, он видит одни и те же свойства строки подключения и связывает их с исходным пулом. Это правильно?   -  person Astupidhippo    schedule 22.04.2021
comment
Закрывать. Не начальный пул, а скорее пул для этих свойств (это может быть не первый/начальный пул). На самом деле, в зависимости от реализации (мы говорим о пуле соединений в целом, но я считаю, что каждый провайдер ADO.NET реализует пул соединений для себя), он может просто сравнивать строку, символ за символом, а не набор значений свойств. Поэтому описания обычно просто говорят об одной и той же строке подключения. Но в остальном да, это правильно.   -  person madreflection    schedule 22.04.2021
comment
@madreflection Понятно, теперь я понимаю. Благодарю вас!   -  person Astupidhippo    schedule 23.04.2021