@andreyyka

Как правильно использовать pg-pool в nodejs?

Не могу разобраться с тем, как правильно использовать 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);});
  • Вопрос задан
  • 4168 просмотров
Решения вопроса 1
Kwisatz
@Kwisatz
Больше web-приложений, хороших и разных
Я пару лет назад пытался склепать демонстрационное приложение на ноде под мои требования: полный провал. Библиотеки для работы с pg там недоразвитые в хлам.
По поводу пула вы можете решить это с другой стороны: pgBouncer
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы