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

Knoten, der die Postgres-Funktion mit temporären Tabellen aufruft, verursacht Speicherverlust

Dann benutze sie nicht. Sie können Abfragen trotzdem direkt ausführen, wie unten gezeigt.

Es ist kein völlig falscher Ansatz, es ist nur ein sehr umständlicher, da Sie versuchen, etwas zu erstellen, das von anderen für eine viel einfachere Verwendung implementiert wurde. Infolgedessen machen Sie viele Fehler, die zu vielen Problemen führen können, einschließlich Speicherlecks.

Vergleichen Sie mit der Einfachheit des exakt gleichen Beispiels, das pg-promise verwendet :

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

Wird noch einfacher, wenn Sie die ES6-Syntax verwenden:

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

Das einzige, was ich in Ihrem Beispiel nicht ganz verstanden habe - die Verwendung einer Transaktion zum Ausführen eines einzelnen SELECT . Dies ist im Allgemeinen nicht der Zweck von Transaktionen, da Sie keine Daten ändern. Ich nehme an, Sie haben versucht, ein echtes Stück Code zu verkleinern, das auch einige Daten ändert.

Falls Sie keine Transaktion benötigen, kann Ihr Code weiter reduziert werden auf:

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

AKTUALISIEREN

Es wäre jedoch ein gefährlicher Ansatz, das Ende der vorherigen Anfrage nicht zu kontrollieren, was ebenfalls zu Speicher-/Verbindungsproblemen führen kann.

Ein sicherer Ansatz sollte sein:

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

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

            setTimeout(poll, 55);
        });
}