PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Délai d'expiration de la requête dans pg-promise

De l'auteur de pg-promise...

pg-promise ne prend pas en charge l'annulation des requêtes, car il s'agit d'un hack pour contourner une conception de base de données incorrecte ou une mauvaise exécution des requêtes.

PostgreSQL prend en charge les événements qui doivent être utilisés lors de l'exécution de requêtes chronophages, donc au lieu d'attendre, on peut définir un écouteur d'événement pour qu'il se déclenche lorsque des données/vues spécifiques deviennent disponibles. Voir l'exemple LISTEN/NOTIFY.

Vous pouvez étendre pg-promise avec votre propre méthode de requête personnalisée qui expirera avec un rejet (voir l'exemple ci-dessous), mais c'est encore une autre solution de contournement en plus d'un problème de conception.

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

Ensuite, vous pouvez utiliser db.queryTimeout(query, values, delay) à tous les niveaux.

Alternativement, si vous utilisez Bluebird, vous pouvez chaîner .timeout(delay) à l'une des méthodes existantes :

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

Voir aussi :

  • étendre l'événement
  • Bluebird.timeout

MISE À JOUR

À partir de la version 8.5.3, pg-promise a commencé à prendre en charge les délais d'attente des requêtes, via la propriété query_timeout dans l'objet de connexion.

Vous pouvez soit remplacer les valeurs par défaut :

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

Ou spécifiez-le dans l'objet de connexion :

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

    query_timeout: 3000
});