PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Nœud appelant la fonction postgres avec des tables temporaires provoquant une fuite de mémoire

Alors ne les utilisez pas. Vous pouvez toujours exécuter des requêtes directement, comme indiqué ci-dessous.

Ce n'est pas une approche complètement fausse, c'est juste une approche très maladroite, car vous essayez de créer quelque chose qui a été implémenté par d'autres pour une utilisation beaucoup plus facile. Par conséquent, vous commettez de nombreuses erreurs qui peuvent entraîner de nombreux problèmes, notamment des fuites de mémoire.

Comparez à la simplicité du même exemple qui utilise 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

Devient encore plus simple lors de l'utilisation de la syntaxe 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

La seule chose que je n'ai pas bien comprise dans votre exemple - l'utilisation d'une transaction pour exécuter un seul SELECT . Ce n'est généralement pas à cela que servent les transactions, car vous ne modifiez aucune donnée. Je suppose que vous essayiez de réduire un vrai morceau de code qui modifie également certaines données.

Si vous n'avez pas besoin d'une transaction, votre code peut encore être réduit à :

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

MISE À JOUR

Ce serait cependant une approche dangereuse de ne pas contrôler la fin de la requête précédente, ce qui pourrait également créer des problèmes de mémoire/connexion.

Une approche sûre devrait être :

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

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

            setTimeout(poll, 55);
        });
}