sql >> Database >  >> RDS >> PostgreSQL

Node roept postgres-functie aan met tijdelijke tabellen die geheugenlek veroorzaken

Gebruik ze dan niet. U kunt query's nog steeds rechtstreeks uitvoeren, zoals hieronder weergegeven.

Het is niet een totaal verkeerde benadering, het is gewoon een heel onhandige, omdat je iets probeert te creëren dat door anderen is geïmplementeerd voor een veel gemakkelijker gebruik. Als gevolg hiervan maak je veel fouten die tot veel problemen kunnen leiden, waaronder geheugenlekken.

Vergelijk met de eenvoud van exact hetzelfde voorbeeld dat gebruikmaakt van 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

Wordt nog eenvoudiger bij gebruik van de ES6-syntaxis:

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

Het enige dat ik in je voorbeeld niet helemaal begreep - het gebruik van een transactie om een ​​enkele SELECT uit te voeren . Daar zijn transacties over het algemeen niet voor bedoeld, aangezien u geen gegevens wijzigt. Ik neem aan dat je een echt stuk code probeerde te verkleinen dat je had en dat ook enkele gegevens verandert.

Als u geen transactie nodig heeft, kan uw code verder worden teruggebracht tot:

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

UPDATE

Het zou echter een gevaarlijke benadering zijn om het einde van het vorige verzoek niet te controleren, wat ook geheugen-/verbindingsproblemen kan veroorzaken.

Een veilige aanpak zou moeten zijn:

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

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

            setTimeout(poll, 55);
        });
}


  1. Onjuiste resultaten met samenvoegen samenvoegen

  2. Verbinding maken met de database vanuit Unity

  3. Converteer het Amerikaanse datumformaat naar ANSI SQL-datumformaat (JJJJ-mm-dd)

  4. invoegen in tabel selecteer max(kolomnaam)+1