Sono l'autore di node-postgres. Innanzitutto, mi scuso per la documentazione che non è riuscita a chiarire l'opzione giusta:è colpa mia. cercherò di migliorarlo. Ho scritto un Gist proprio ora per spiegarlo perché la conversazione è diventata troppo lunga per Twitter.
Utilizzando pg.connect
è la strada da percorrere in un ambiente web.
Il server PostgreSQL può gestire solo 1 query alla volta per connessione. Ciò significa che se hai 1 new pg.Client()
globale collegata al tuo back-end, l'intera app è bloccata in base alla velocità con cui postgrescan risponde alle domande. Allineerà letteralmente tutto, accodando ogni query. Sì, è asincrono e quindi va bene... ma non moltiplichi il tuo throughput per 10 volte? Usa pg.connect
imposta il pg.defaults.poolSize
a qualcosa di sano (facciamo 25-100, non sono ancora sicuro del numero giusto).
new pg.Client
è per quando sai cosa stai facendo. Quando hai bisogno di un singolo cliente di lunga durata per qualche motivo o hai bisogno di controllare molto attentamente il ciclo di vita. Un buon esempio è quando si usa LISTEN/NOTIFY
. Il client in ascolto deve essere presente e connesso e non condiviso in modo che possa gestire correttamente NOTIFY
messaggi. Un altro esempio potrebbe essere quando si apre un client 1-off per uccidere roba sospesa o negli script della riga di comando.
Una cosa molto utile è centralizzare tutti gli accessi al database nella tua app in un unico file. Non sporcare pg.connect
chiamate o nuovi clienti in tutto. Avere un file come db.js
assomiglia a questo:
module.exports = {
query: function(text, values, cb) {
pg.connect(function(err, client, done) {
client.query(text, values, function(err, result) {
done();
cb(err, result);
})
});
}
}
In questo modo puoi modificare la tua implementazione da pg.connect
a un pool personalizzato di clienti o altro e devi solo cambiare le cose in un unico posto.
Dai un'occhiata al modulo node-pg-query che fa proprio questo.