sql >> Databáze >  >> RDS >> PostgreSQL

Uzel volá postgresovou funkci s dočasnými tabulkami způsobující únik paměti

Pak je nepoužívejte. Stále můžete provádět dotazy přímo, jak je uvedeno níže.

Není to úplně špatný přístup, je to jen velmi nešikovný, protože se snažíte vytvořit něco, co bylo implementováno ostatními pro mnohem jednodušší použití. V důsledku toho děláte mnoho chyb, které mohou vést k mnoha problémům, včetně úniků paměti.

Porovnejte s jednoduchostí úplně stejného příkladu, který používá 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

Je to ještě jednodušší při použití 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

Jediná věc, kterou jsem na vašem příkladu úplně nepochopil - použití transakce k provedení jednoho SELECT . K tomu transakce obecně neslouží, protože neměníte žádná data. Předpokládám, že jste se snažili zmenšit skutečný kus kódu, který jste měli a který také mění některá data.

V případě, že transakci nepotřebujete, může být váš kód dále snížen na:

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

AKTUALIZACE

Bylo by však nebezpečné nekontrolovat konec předchozího požadavku, což také může způsobit problémy s pamětí/připojením.

Bezpečný přístup by měl být:

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

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

            setTimeout(poll, 55);
        });
}


  1. Přístup odepřen pro uživatele 'root'@'localhost' (pomocí hesla:YES )

  2. datum sloupce nelze automaticky přetypovat pro zadání časového razítka s časovým pásmem django/postgres

  3. Máte již jiný mysqld server spuštěný na portu:3306 Ubuntu

  4. Získejte konkrétní počet hodnot sloupce v oracle s vnitřním spojením