Jeg er forfatter til node-postgres. Først undskylder jeg, at dokumentationen ikke har gjort den rigtige mulighed klar:det er min skyld. Jeg vil prøve at forbedre det. Jeg skrev lige nu en Gist for at forklare dette, fordi samtalen blev for lang til Twitter.
Brug af pg.connect
er vejen at gå i et webmiljø.
PostgreSQL-serveren kan kun håndtere 1 forespørgsel ad gangen pr. forbindelse. Det betyder, at hvis du har 1 global new pg.Client()
forbundet til din backend hele din app er flaskehalsede baseret på hvor hurtigt postgrescan reagerer på forespørgsler. Det vil bogstaveligt talt stille alt op, og stille hver forespørgsel i kø. Ja, det er asynkront, og så det er okay... men ville du ikke gange din gennemstrømning med 10x? Brug pg.connect
indstille pg.defaults.poolSize
til noget fornuftigt (vi laver 25-100, ikke sikker på det rigtige tal endnu).
new pg.Client
er til når du ved hvad du laver. Når du har brug for en enkelt langvarig klient af en eller anden grund eller har brug for meget omhyggeligt at kontrollere livscyklussen. Et godt eksempel på dette er, når du bruger LISTEN/NOTIFY
. Den lyttende klient skal være omkring og forbundet og ikke delt, så den korrekt kan håndtere NOTIFY
meddelelser. Et andet eksempel ville være, når du åbner en 1-off-klient for at dræbe noget hængende ting eller i kommandolinjescripts.
En meget nyttig ting er at centralisere al adgang til din database i din app til én fil. Affald ikke pg.connect
opkald eller nye kunder hele vejen igennem. Har en fil som db.js
der ser sådan ud:
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å denne måde kan du ændre din implementering fra pg.connect
til en brugerdefineret pulje af kunder eller hvad som helst og kun skal ændre tingene ét sted.
Tag et kig på node-pg-query-modulet, der gør netop dette.