PostgreSQL: использовать то же соединение или получить другое из пула?

У меня есть сценарий Node.js и база данных PostgreSQL, и я буду использовать библиотеку, которая поддерживает пул подключений к базе данных.

Скажем, у меня есть скрипт, который запрашивает базу данных несколько раз (не транзакция) в разных частях скрипта. Как определить, следует ли мне получить одно соединение/клиент? и повторно использовать его повсюду* или приобретать нового клиента из пула для каждого запроса? (Оба работают, но у кого лучше производительность?)

*task в библиотеке pg-promise, connect в библиотеке node-postgres.


...
// Acquire connection from pool.
(Database query)
(Non-database-related code)
(Database query)
// Release connection to pool.
...

or

...
// Acquire connection from pool.
(Database query)
// Release connection to pool.
(Non-database-related code)
// Acquire connection from pool.
(Database query)
// Release connection to pool.
...

person Code    schedule 16.07.2017    source источник
comment
Вы читали это? - связывание запросов.   -  person vitaly-t    schedule 16.07.2017
comment
@vitaly-t Почему второй метод истощает пул? Разве клиент не получает релиз обратно после каждого запроса?   -  person Code    schedule 16.07.2017
comment
Истощение из-за высокого параллелизма, т. е. с большим количеством запросов, пытающихся выполнить параллельно, чем общее количество подключений, доступных в пуле. Новые будут зависать, ожидая, пока соединение станет доступным в пуле. Вот почему использование задач важно в загруженной системе.   -  person vitaly-t    schedule 16.07.2017
comment
@vitaly-t Я не понимаю. Каждый экземпляр сценария будет выполнять не более одного запроса за раз, независимо от используемого метода. Нет?   -  person Code    schedule 16.07.2017
comment
В службе HTTP запросы выполняются одновременно, как и обработчики HTTP, поэтому может быть любое количество одновременных запросов.   -  person vitaly-t    schedule 16.07.2017


Ответы (2)


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

person aschoerk    schedule 16.07.2017

Вы можете использовать модуль node-postgres, который облегчит вам задачу. А на ваш вопрос, когда использовать пул, вот краткий ответ.

Сервер PostgreSQL может обрабатывать только 1 запрос за раз для каждого соединения. Это означает, что если у вас есть 1 глобальный новый pg.Client(), подключенный к вашему бэкэнду, все ваше приложение будет узким местом в зависимости от того, насколько быстро postgres может отвечать на запросы. Он буквально выстроит все в очередь, поставив в очередь каждый запрос. Да, это асинхронно, так что все в порядке... но не лучше ли увеличить пропускную способность в 10 раз? Используйте pg.connect, установите pg.defaults.poolSize на что-то разумное (мы делаем 25-100, еще не уверены, что это правильное число).

новый pg.Client предназначен для тех случаев, когда вы знаете, что делаете. Когда вам по какой-то причине нужен один долгоживущий клиент или нужно очень тщательно контролировать жизненный цикл. Хорошим примером этого является использование LISTEN/NOTIFY. Слушающий клиент должен быть рядом, подключен и не разделен, чтобы он мог правильно обрабатывать сообщения NOTIFY. Другим примером может быть открытие одноразового клиента для уничтожения некоторых зависших вещей или в сценариях командной строки.

вот ссылка этого модуля. Надеюсь, это поможет. https://github.com/brianc/node-postgres

Вы можете увидеть документацию там и о пуле. Спасибо :)

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

person Yash Ganatra    schedule 16.07.2017