sql >> Base de Datos >  >> RDS >> PostgreSQL

Nodo que llama a la función postgres con tablas temporales que causan pérdida de memoria

Entonces no los uses. Todavía puede ejecutar consultas directamente, como se muestra a continuación.

No es un enfoque completamente incorrecto, es simplemente muy incómodo, ya que está tratando de crear algo que otros implementaron para un uso mucho más fácil. Como resultado, está cometiendo muchos errores que pueden generar muchos problemas, incluidas pérdidas de memoria.

Compare con la simplicidad del mismo ejemplo exacto que usa 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

Se vuelve aún más simple cuando se usa la sintaxis de 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

Lo único que no entendí bien en su ejemplo:el uso de una transacción para ejecutar un solo SELECT . Esto no es para lo que generalmente son las transacciones, ya que no está cambiando ningún dato. Asumo que estabas tratando de encoger un código real que tenías y que también cambia algunos datos.

En caso de que no necesite una transacción, su código puede reducirse aún más 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

ACTUALIZAR

Sin embargo, sería un enfoque peligroso no controlar el final de la solicitud anterior, lo que también puede crear problemas de memoria/conexión.

Un enfoque seguro debe ser:

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

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

            setTimeout(poll, 55);
        });
}