Jag är författare till node-postgres. Först ber jag om ursäkt för att dokumentationen inte har klargjort rätt alternativ:det är mitt fel. Jag ska försöka förbättra det. Jag skrev en sammanfattning just nu för att förklara detta eftersom konversationen blev för lång för Twitter.
Använder
pg.connect
är vägen att gå i en webbmiljö.PostgreSQL-servern kan bara hantera en fråga åt gången per anslutning. Det betyder att om du har en global
new pg.Client()
ansluten till din backend hela din app är flaskhalsad baserat på hur snabbt postgrescan svarar på frågor. Det kommer bokstavligen att rada upp allt, köa varje fråga. Ja, det är asynkront och så det är okej... men skulle du inte multiplicera din genomströmning med 10x? Användpg.connect
ställ inpg.defaults.poolSize
till något vettigt (vi gör 25-100, inte säker på rätt nummer än).
new pg.Client
är för när du vet vad du gör. När du behöver en enda långlivad klient av någon anledning eller behöver mycket noggrant kontrollera livscykeln. Ett bra exempel på detta är när du använderLISTEN/NOTIFY
. Den lyssnande klienten måste vara runt och ansluten och inte delad så att den korrekt kan hanteraNOTIFY
meddelanden. Ett annat exempel skulle vara när du öppnar en engångsklient för att döda något hängt eller i kommandoradsskript.
En mycket användbar sak är att centralisera all åtkomst till din databas i din app till en fil. Strö inte ned pg.connect
samtal eller nya kunder genomgående. Ha en fil som db.js
som ser ut ungefär så här:
module.exports = {
query: function(text, values, cb) {
pg.connect(function(err, client, done) {
client.query(text, values, function(err, result) {
done();
cb(err, result);
})
});
}
}
På så sätt kan du ändra din implementering från pg.connect
till en anpassad pool av kunder eller vad som helst och behöver bara ändra saker på ett ställe.
Ta en titt på modulen node-pg-query som gör just detta.