sql >> Base de Datos >  >> RDS >> PostgreSQL

Tiempo de espera de consulta en pg-promise

Del autor de pg-promise...

pg-promise no admite la cancelación de consultas, porque es un truco para solucionar el diseño incorrecto de la base de datos o la mala ejecución de consultas.

PostgreSQL admite eventos que deben usarse al ejecutar consultas que consumen mucho tiempo, por lo que en lugar de esperar, se puede configurar un detector de eventos para que se active cuando una vista o datos específicos estén disponibles. Vea el ejemplo ESCUCHAR/NOTIFICAR.

Puede ampliar pg-promise con su propio método de consulta personalizado que se agotará con un rechazo (vea el ejemplo a continuación), pero esa es otra solución además de un problema de diseño.

Ejemplo usando Bluebird:

const Promise = require('bluebird');

Promise.config({
    cancellation: true
});


const initOptions = {
    promiseLib: Promise,
    extend(obj) {
        obj.queryTimeout = (query, values, delay) => {
            return obj.any(query, values).timeout(delay);
        }
    }
};

const pgp = require('pg-promise')(initOptions);
const db = pgp(/* connection details */);

Luego puede usar db.queryTimeout(query, values, delay) en todos los niveles.

Alternativamente, si está utilizando Bluebird, puede encadenar .timeout(delay) a cualquiera de los métodos existentes:

db.any(query, values)
    .timeout(500)
    .then(data => {})
    .catch(error => {})

Véase también:

  • extender evento
  • Bluebird.tiempo de espera

ACTUALIZAR

A partir de la versión 8.5.3, pg-promise comenzó a admitir tiempos de espera de consultas a través de la propiedad query_timeout dentro del objeto de conexión.

Puede anular los valores predeterminados:

pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds

O especifíquelo dentro del objeto de conexión:

const db = pgp({
    /* all connection details */

    query_timeout: 3000
});