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

Nodo che chiama la funzione postgres con tabelle temporanee che causano perdita di memoria

Allora non usarli. Puoi comunque eseguire query direttamente, come mostrato di seguito.

Non è un approccio completamente sbagliato, è solo molto imbarazzante, poiché stai cercando di creare qualcosa che è stato implementato da altri per un uso molto più semplice. Di conseguenza, stai commettendo molti errori che possono portare a molti problemi, comprese le perdite di memoria.

Confronta con la semplicità dello stesso identico esempio che utilizza 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

Diventa ancora più semplice quando si utilizza la sintassi ES6:

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

L'unica cosa che non ho capito bene nel tuo esempio:l'uso di una transazione per eseguire un singolo SELECT . Questo non è lo scopo generale delle transazioni, poiché non stai modificando alcun dato. Presumo che stavi cercando di ridurre un vero pezzo di codice che avevi che modifica anche alcuni dati.

Nel caso in cui non ti serva una transazione, il tuo codice può essere ulteriormente ridotto a:

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

AGGIORNAMENTO

Sarebbe un approccio pericoloso, tuttavia, non controllare la fine della richiesta precedente, che potrebbe anche creare problemi di memoria/connessione.

Un approccio sicuro dovrebbe essere:

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

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

            setTimeout(poll, 55);
        });
}