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

Node kalder postgres-funktion med temp-tabeller, der forårsager hukommelseslækage

Så brug dem ikke. Du kan stadig udføre forespørgsler direkte, som vist nedenfor.

Det er ikke en helt forkert tilgang, det er bare en meget akavet tilgang, da du forsøger at skabe noget, der er blevet implementeret af andre til en meget lettere brug. Som et resultat begår du mange fejl, der kan føre til mange problemer, herunder hukommelseslækager.

Sammenlign med enkelheden i nøjagtig det samme eksempel, der bruger 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

Bliver endnu enklere, når du bruger ES6-syntaks:

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 eneste, jeg ikke helt forstod i dit eksempel - brugen af ​​en transaktion til at udføre en enkelt SELECT . Det er ikke, hvad transaktioner generelt er til, da du ikke ændrer nogen data. Jeg går ud fra, at du forsøgte at formindske et rigtigt stykke kode, du havde, som også ændrer nogle data.

Hvis du ikke har brug for en transaktion, kan din kode reduceres yderligere til:

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

OPDATERING

Det ville dog være en farlig tilgang ikke at kontrollere slutningen af ​​den tidligere anmodning, hvilket også kan skabe problemer med hukommelse/forbindelse.

En sikker tilgang bør være:

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

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

            setTimeout(poll, 55);
        });
}


  1. Knee-Jerk PerfMon tællere:Sidelevetid

  2. Konverter brøk til decimal

  3. Opdater Oracle-tabel med værdier fra CSV-fil

  4. Formatering af et numerisk SQL-forespørgselsresultat med et vilkårligt antal decimaler