sql >> Databasteknik >  >> RDS >> PostgreSQL

Nod som anropar postgres-funktion med temptabeller som orsakar minnesläcka

Använd dem då inte. Du kan fortfarande utföra frågor direkt, som visas nedan.

Det är inte ett helt fel tillvägagångssätt, det är bara en väldigt besvärlig sådan, eftersom du försöker skapa något som har implementerats av andra för en mycket enklare användning. Som ett resultat gör du många misstag som kan leda till många problem, inklusive minnesläckor.

Jämför med enkelheten i exakt samma exempel som använder pg-promise :

var pgp = require('pg-promise')();
var conString = "postgres://username:[email protected]/database";
var db = pgp(conString);

function getJobs() {
    return db.tx(function (t) {
        return t.func('get_jobs');
    });
}

function poll() {
    getJobs()
        .then(function (jobs) {
            // process the jobs
        })
        .catch(function (error) {
            // error
        });

    setTimeout(poll, 55);
}

poll(); // start polling

Blir ännu enklare när du använder ES6-syntax:

var pgp = require('pg-promise')();
var conString = "postgres://username:[email protected]/database";
var db = pgp(conString);

function poll() {
    db.tx(t=>t.func('get_jobs'))
        .then(jobs=> {
            // process the jobs
        })
        .catch(error=> {
            // error
        });

    setTimeout(poll, 55);
}

poll(); // start polling

Det enda som jag inte riktigt förstod i ditt exempel - användningen av en transaktion för att utföra en enda SELECT . Det är inte vad transaktioner i allmänhet är till för, eftersom du inte ändrar någon data. Jag antar att du försökte krympa en riktig kodbit som också ändrar vissa data.

Om du inte behöver en transaktion kan din kod reduceras ytterligare till:

var pgp = require('pg-promise')();
var conString = "postgres://username:[email protected]/database";
var db = pgp(conString);

function poll() {
    db.func('get_jobs')
        .then(jobs=> {
            // process the jobs
        })
        .catch(error=> {
            // error
        });

    setTimeout(poll, 55);
}

poll(); // start polling

UPPDATERA

Det skulle dock vara ett farligt tillvägagångssätt att inte kontrollera slutet av föregående begäran, vilket också kan skapa problem med minne/anslutningar.

Ett säkert tillvägagångssätt bör vara:

function poll() {
    db.tx(t=>t.func('get_jobs'))
        .then(jobs=> {
            // process the jobs

            setTimeout(poll, 55);
        })
        .catch(error=> {
            // error

            setTimeout(poll, 55);
        });
}


  1. Oracle DateTime i Where-klausul?

  2. Uppdatering av Oracle Table från Excel VBA Macro med ODBC-anslutning

  3. Fulltextsökning med InnoDB i MySQL

  4. UNIX_TIMESTAMP() Exempel – MySQL