Не могу разобраться с тем, как правильно использовать node-pg-pool (
https://github.com/brianc/node-pg-pool) и вообще помогает ли оно мне.
Суть проблемы. Вроде бы ожидаю, что пул подключений должен сократить расходы на подключение к БД (первая причина использовать pg-pool по ссылке
https://node-postgres.com/features/pooling ), которое тратит время (ну т.е. если на каждый новых чих открывать и закрывать новый коннект -- избыточная нагрузка и дополнительные задержки), ибо пул будет хранить заранее заготовленный набор подключений, которые при необходимости берутся из пула, а после использования могут возвращаться в пул.
Не могу сделать нормальный сценарий, чтобы подключения возвращались в пул или хотя бы в нём хранились неиспользуемые подключения (см. код). Ну т.е. у меня либо накапливаются постоянно новые подключения (чье количество упирается в max и потом создание нового подключения заканчивается ошибкой), либо же пользованные подключения сразу же закрываются. Итогом единственное, с чем справляется пул -- ограничивает максимальное количество подключений, но никак не оптимизирует работу.
// Используется это https://github.com/brianc/node-pg-pool
const { Pool } = require('pg');
// Создаём пул подключений
pool = new Pool({
user: 'qwerty',
host: 'localhost',
database: 'qwerty',
password: 'qwerty',
port: 5432,
max: 10, // Ограничивает количество подключений, работает правильно
min: 5, // не понимаю как работает, у меня client.release() всегда закрывает подключение
idleTimeoutMillis: 1000, // тоже не понимаю как работает
connectionTimeoutMillis: 3000
});
async function someFunction() {
// Выбираем одно подключение из пула. Или же это всегда значит именно новый коннект?
var connection = await pool.connect();
// Что-то делаем-с с этим подключением.
await connection.query('SELECT 1');
// Если освобождать вручную при помощи .release(), то всё подключение к БД закрывается сразу. Если же это не использовать, то подключение начинает простаивать и за max вызовов функции someFunction пул полностью забивается бесполезными подключениями, а pool.connect() в свою очередь делает ошибку.
// connection.release();
// Ставлю вызов этой же функции через несколько секунд
setTimeout(() => {
someFunction().then(() => {}).catch((e) => {
console.log(e);
})
}, 5000);
}
someFunction().then(() => {}).catch((e) => {console.log(e);});