Eu sou o autor de node-postgres . Em primeiro lugar, peço desculpas porque a documentação não deixou clara a opção certa: a culpa é minha. Vou tentar melhorar. Escrevi um Síntese agora para explicar isso porque a conversa ficou muito longa para o Twitter.
Usar pg.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 1 global new pg.Client()
conectado ao seu back-end, seu aplicativo inteiro será controlado com base na rapidez com que o postgres pode responder às consultas. Ele literalmente alinhará tudo, enfileirando cada consulta. Sim, é assíncrono e está tudo bem ... mas você não prefere multiplicar sua taxa de transferência por 10x? Use pg.connect
definir o
pg.defaults.poolSize
para algo lógico (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 é durante o uso
LISTEN/NOTIFY
. O cliente de escuta precisa estar por perto, conectado e não compartilhado para que possa lidar com as NOTIFY
mensagens de maneira adequada . Outro exemplo seria ao abrir um cliente único para eliminar algumas coisas travadas 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 espalhe pg.connect
chamadas ou novos clientes o tempo todo. Tenha um arquivo parecido db.js
com este:
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 o que for e só precisa alterar as coisas em um lugar.
Dê uma olhada no módulo node-pg-query que faz exatamente isso.
Eu sou o autor de pg-promessa , que simplifica o uso de node-postgres por meio de promessas.
Ele aborda as questões sobre a maneira correta de se conectar e desconectar do banco de dados, usando o pool de conexão implementado por node-postgres , entre outras coisas, como transações automatizadas.
Uma solicitação individual na pg-Promessa se resume apenas ao que é relevante para a sua lógica de negócios:
ou seja, você não precisa lidar com a lógica de conexão ao executar consultas, porque você configura a conexão apenas uma vez, globalmente, assim:
Você pode encontrar muitos outros exemplos no tutorial Aprenda por Exemplo ou na página inicial do projeto .
fonte
pg
este é especificado porpg.defaults.ssl = true;
. Como você faz issopg-promise
?pgp.pg.defaults.ssl = true;
A piscina é o caminho a seguir. Algo como este
pode ser usado como
db.query('<BEGIN,COMMIT,ROLLBACK,your query,anything')
fonte
É melhor criar um pool de pg globalmente e cada vez que você precisar fazer uma operação de banco de dados, use o cliente e depois libere-o de volta para o pool. Assim que todas as operações de banco de dados forem concluídas, finalize o pool usando
pool.end()
Código de amostra -
Para obter mais detalhes, você pode consultar minha postagem do blog - Fonte
fonte
Como você pode ver na documentação, ambas as opções são válidas, então escolha a que preferir. Como você, eu escolheria a segunda opção.
fonte
Eu estava interessado em um manipulador muito simples para isso, então fiz o meu próprio sem torná-lo muito complicado. Não tenho ilusões de que seja super básico, mas pode ajudar algumas pessoas a começar. Basicamente, ele se conecta, executa consultas e trata os erros para você.
Então você usaria chamando-o desta forma:
fonte
node-postgres
página é melhor do que isso.É assim que eu faço, uma espécie de "abordagem de todas as opções acima"
fonte