PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Tempo limite da consulta em pg-promise


Do autor de pg-promise...

pg-promise não oferece suporte ao cancelamento de consulta, porque é um hack para contornar o design incorreto do banco de dados ou a execução incorreta da consulta.

O PostgreSQL suporta eventos que devem ser usados ​​ao executar consultas demoradas, portanto, em vez de esperar, pode-se definir um ouvinte de eventos para ser acionado quando dados/visualizações específicos estiverem disponíveis. Veja o exemplo de ESCUTA/NOTIFY.

Você pode estender pg-promise com seu próprio método de consulta personalizado que expirará com uma rejeição (veja o exemplo abaixo), mas isso é novamente outra solução alternativa para um problema de design.

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

Então você pode usar db.queryTimeout(query, values, delay) em todos os níveis.

Alternativamente, se você estiver usando o Bluebird, você pode encadear .timeout(delay) para qualquer um dos métodos existentes:
db.any(query, values)
    .timeout(500)
    .then(data => {})
    .catch(error => {})

Veja também:
  • estender evento
  • Bluebird.timeout

ATUALIZAÇÃO

A partir da versão 8.5.3, o pg-promise começou a oferecer suporte a tempos limite de consulta, por meio da propriedade query_timeout dentro do objeto de conexão.

Você pode substituir os padrões:
pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds

Ou especifique-o no objeto de conexão:
const db = pgp({
    /* all connection details */

    query_timeout: 3000
});