PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Node chamando a função postgres com tabelas temporárias causando vazamento de memória


Então não os use. Você ainda pode executar consultas diretamente, conforme mostrado abaixo.

Não é uma abordagem completamente errada, é apenas muito estranha, pois você está tentando criar algo que foi implementado por outros para um uso muito mais fácil. Como resultado, você está cometendo muitos erros que podem levar a muitos problemas, incluindo vazamentos de memória.

Compare com a simplicidade do mesmo exemplo 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

Fica ainda mais simples ao usar a sintaxe 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

A única coisa que não entendi bem no seu exemplo - o uso de uma transação para executar um único SELECT . Não é para isso que as transações geralmente servem, pois você não está alterando nenhum dado. Suponho que você estava tentando encolher um pedaço real de código que também altera alguns dados.

Caso você não precise de uma transação, seu código pode ser reduzido ainda mais para:
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

ATUALIZAÇÃO

Seria uma abordagem perigosa, no entanto, não controlar o fim da solicitação anterior, o que também pode criar problemas de memória/conexão.

Uma abordagem segura deve ser:
function poll() {
    db.tx(t=>t.func('get_jobs'))
        .then(jobs=> {
            // process the jobs

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

            setTimeout(poll, 55);
        });
}