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

Forespørgselstimeout i pg-promise

Fra forfatteren af ​​pg-promise...

pg-promise understøtter ikke annullering af forespørgsler, fordi det er et hack til at omgå ukorrekt databasedesign eller dårlig udførelse af forespørgsler.

PostgreSQL understøtter hændelser, der bør bruges ved eksekvering af tidskrævende forespørgsler, så i stedet for at vente, kan man indstille en hændelseslytter til at blive udløst, når specifik data/visning bliver tilgængelig. Se eksempel på LYT/MELD.

Du kan udvide pg-promise med din egen brugerdefinerede forespørgselsmetode, der vil timeout med et afslag (se eksempel nedenfor), men det er igen en anden løsning oven på et designproblem.

Eksempel ved brug af 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 */);

Så kan du bruge db.queryTimeout(query, values, delay) på alle niveauer.

Alternativt, hvis du bruger Bluebird, kan du sammenkæde .timeout(delay) til enhver af de eksisterende metoder:

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

Se også:

  • forlæng begivenhed
  • Bluebird.timeout

OPDATERING

Fra version 8.5.3 begyndte pg-promise at understøtte forespørgselstimeout via egenskaben query_timeout i forbindelsesobjektet.

Du kan enten tilsidesætte standardindstillingerne:

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

Eller angiv det i forbindelsesobjektet:

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

    query_timeout: 3000
});



  1. Sådan transponeres rækker til kolonner dynamisk i MySQL

  2. Maksimal størrelse af en varchar(max) variabel

  3. Hurtigste måde at importere stor CSV-fil til MySql ved hjælp af MySql CLI

  4. SQL IN Klausul 1000 varegrænse