Я автор node-postgres . Во-первых, я прошу прощения, что в документации не указан правильный вариант: это моя вина. Постараюсь улучшить. Я только что написал Gist, чтобы объяснить это, потому что разговор стал слишком длинным для Twitter.
Использование pg.connect
- это путь в веб-среде.
Сервер PostgreSQL может обрабатывать только 1 запрос за раз за одно соединение. Это означает, что если у вас есть 1 глобальный new pg.Client()
сервер, подключенный к вашему бэкэнду, все ваше приложение будет узким местом в зависимости от того, насколько быстро postgres может отвечать на запросы. Он буквально выстраивает все в очередь, ставя каждый запрос в очередь. Да, это асинхронно, и это нормально ... но не лучше ли умножить пропускную способность в 10 раз? Используйте, чтобы pg.connect
установить что-
pg.defaults.poolSize
нибудь вменяемое (мы делаем 25-100, пока не уверены в правильности числа).
new pg.Client
когда вы знаете, что делаете. Когда вам по какой-то причине нужен один-единственный долгоживущий клиент или вам нужно очень тщательно контролировать жизненный цикл. Хороший пример этого - использование
LISTEN/NOTIFY
. Слушающий клиент должен быть поблизости и подключен, а не использоваться совместно, чтобы он мог правильно обрабатывать NOTIFY
сообщения. Другим примером может быть открытие одноразового клиента для уничтожения зависшего или в сценариях командной строки.
Одна очень полезная вещь - централизовать весь доступ к вашей базе данных в вашем приложении в один файл. Не мешайте pg.connect
звонкам или новым клиентам. Пусть такой файл db.js
выглядит примерно так:
module.exports = {
query: function(text, values, cb) {
pg.connect(function(err, client, done) {
client.query(text, values, function(err, result) {
done();
cb(err, result);
})
});
}
}
Таким образом, вы можете изменить свою реализацию pg.connect
на настраиваемый пул клиентов или что-то еще, и вам нужно будет изменить что-то только в одном месте.
Взгляните на модуль node-pg-query, который делает именно это.