PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abfragezeitüberschreitung in pg-promise

Vom Autor von pg-promise...

pg-promise unterstützt keinen Abfrageabbruch, weil es ein Hack ist, um ein falsches Datenbankdesign oder eine schlechte Abfrageausführung zu umgehen.

PostgreSQL unterstützt Ereignisse, die verwendet werden sollten, wenn zeitaufwändige Abfragen ausgeführt werden. Anstatt zu warten, kann man also einen Ereignis-Listener festlegen, der ausgelöst wird, wenn bestimmte Daten/Ansichten verfügbar werden. Siehe LISTEN/NOTIFY-Beispiel.

Sie können pg-promise mit Ihrer eigenen benutzerdefinierten Abfragemethode erweitern, die mit einer Ablehnung abläuft (siehe Beispiel unten), aber das ist wieder eine weitere Problemumgehung zusätzlich zu einem Designproblem.

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

Dann können Sie db.queryTimeout(query, values, delay) verwenden auf jeder Ebene.

Wenn Sie Bluebird verwenden, können Sie alternativ .timeout(delay) verketten zu einer der vorhandenen Methoden:

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

Siehe auch:

  • Ereignis verlängern
  • Bluebird.timeout

AKTUALISIEREN

Ab Version 8.5.3 unterstützte pg-promise Abfrage-Timeouts über die Eigenschaft query_timeout innerhalb des Verbindungsobjekts.

Sie können entweder die Standardwerte überschreiben:

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

Oder geben Sie es innerhalb des Verbindungsobjekts an:

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

    query_timeout: 3000
});