Soy el autor de node-postgres. En primer lugar, pido disculpas porque la documentación no ha aclarado la opción correcta:es mi culpa. Intentaré mejorarlo. Acabo de escribir una Gist para explicar esto porque la conversación se hizo demasiado larga para Twitter.
Usando pg.connect
es el camino a seguir en un entorno web.
El servidor PostgreSQL solo puede manejar 1 consulta a la vez por conexión. Eso significa que si tiene 1 new pg.Client()
global conectado a su backend, toda su aplicación tiene un cuello de botella en función de la rapidez con la que postgrescan responde a las consultas. Literalmente alineará todo, poniendo en cola cada consulta. Sí, es asíncrono y eso está bien... pero ¿no preferiría multiplicar su rendimiento por 10x? Usa pg.connect
establecer el pg.defaults.poolSize
a algo cuerdo (hacemos 25-100, aún no estoy seguro del número correcto).
new pg.Client
es para cuando sabes lo que estás haciendo. Cuando necesita un solo cliente de larga duración por alguna razón o necesita controlar con mucho cuidado el ciclo de vida. Un buen ejemplo de esto es cuando se usa LISTEN/NOTIFY
. El cliente que escucha debe estar cerca y conectado y no compartido para que pueda manejar correctamente NOTIFY
mensajes. Otro ejemplo sería al abrir un cliente único para matar cosas colgadas o en secuencias de comandos de línea de comandos.
Una cosa muy útil es centralizar todo el acceso a su base de datos en su aplicación en un solo archivo. No tires basura pg.connect
llamadas o nuevos clientes en todo momento. Tener un archivo como db.js
que se parece a esto:
module.exports = {
query: function(text, values, cb) {
pg.connect(function(err, client, done) {
client.query(text, values, function(err, result) {
done();
cb(err, result);
})
});
}
}
De esta manera, puede cambiar su implementación desde pg.connect
a un grupo personalizado de clientes o lo que sea y solo tiene que cambiar las cosas en un lugar.
Eche un vistazo al módulo node-pg-query que hace exactamente esto.