Eu sou o autor de node-postgres. Primeiro, peço desculpas, a documentação não conseguiu esclarecer a opção certa:a culpa é minha. Vou tentar melhorá-lo. Eu escrevi um Gist agora para explicar isso porque a conversa ficou muito longa para o Twitter.
Usandopg.connect
é o caminho a seguir em um ambiente web.
O servidor PostgreSQL só pode lidar com 1 consulta por vez por conexão. Isso significa que se você tiver 1new pg.Client()
global conectado ao seu back-end, todo o seu aplicativo tem gargalos com base na rapidez com que o postgrescan responde às consultas. Ele literalmente alinhará tudo, enfileirando cada consulta. Sim, é assíncrono e tudo bem... mas você não multiplicaria sua taxa de transferência por 10x? Usepg.connect
defina opg.defaults.poolSize
para algo são (nós fazemos 25-100, não temos certeza do número certo ainda).
new pg.Client
é para quando você sabe o que está fazendo. Quando você precisa de um único cliente de longa duração por algum motivo ou precisa controlar com muito cuidado o ciclo de vida. Um bom exemplo disso é ao usarLISTEN/NOTIFY
. O cliente de escuta precisa estar por perto e conectado e não compartilhado para que possa lidar adequadamente comNOTIFY
messages.Outro exemplo seria ao abrir um cliente 1-off para matar alguma coisa pendurada ou em scripts de linha de comando.
Uma coisa muito útil é centralizar todo o acesso ao seu banco de dados em seu aplicativo em um arquivo. Não jogue lixo no
pg.connect
chamadas ou novos clientes por toda parte. Tenha um arquivo como db.js
que se parece com isso:module.exports = {
query: function(text, values, cb) {
pg.connect(function(err, client, done) {
client.query(text, values, function(err, result) {
done();
cb(err, result);
})
});
}
}
Dessa forma, você pode alterar sua implementação de
pg.connect
para um pool personalizado de clientes ou qualquer outra coisa e só precisa mudar as coisas em um lugar. Dê uma olhada no módulo node-pg-query que faz exatamente isso.