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

Timeout della query in pg-promise

Dall'autore di pg-promise...

pg-promise non supporta l'annullamento delle query, perché è un trucco per aggirare la progettazione errata del database o l'esecuzione errata della query.

PostgreSQL supporta gli eventi che dovrebbero essere utilizzati durante l'esecuzione di query che richiedono tempo, quindi invece di attendere, è possibile impostare un listener di eventi da attivare quando diventano disponibili dati/viste specifici. Vedi esempio ASCOLTA/NOTIFICA.

Puoi estendere pg-promise con il tuo metodo di query personalizzato che scadrà con un rifiuto (vedi esempio di seguito), ma questa è ancora un'altra soluzione per risolvere un problema di progettazione.

Esempio utilizzando 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 */);

Quindi puoi utilizzare db.queryTimeout(query, values, delay) ad ogni livello.

In alternativa, se stai usando Bluebird, puoi concatenare .timeout(delay) a uno qualsiasi dei metodi esistenti:

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

Vedi anche:

  • estendere l'evento
  • Bluebird.timeout

AGGIORNAMENTO

Dalla versione 8.5.3, pg-promise ha iniziato a supportare i timeout delle query, tramite la proprietà query_timeout all'interno dell'oggetto connessione.

Puoi ignorare le impostazioni predefinite:

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

Oppure specificalo all'interno dell'oggetto connessione:

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

    query_timeout: 3000
});