PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Qual è il modo corretto di utilizzare il modulo postgresql node.js?

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.