PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Węzeł wywołujący funkcję postgres z tabelami tymczasowymi powodującymi wyciek pamięci

Więc ich nie używaj. Nadal możesz wykonywać zapytania bezpośrednio, jak pokazano poniżej.

Nie jest to całkowicie złe podejście, jest po prostu bardzo niezręczne, ponieważ próbujesz stworzyć coś, co zostało zaimplementowane przez innych w celu znacznie łatwiejszego użycia. W rezultacie popełniasz wiele błędów, które mogą prowadzić do wielu problemów, w tym wycieków pamięci.

Porównaj z prostotą dokładnie tego samego przykładu, w którym użyto 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

Staje się jeszcze prostsze przy użyciu składni 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

Jedyna rzecz, której nie do końca zrozumiałem w twoim przykładzie - użycie transakcji do wykonania pojedynczego SELECT . Nie do tego zazwyczaj służą transakcje, ponieważ nie zmieniasz żadnych danych. Zakładam, że próbowałeś zmniejszyć prawdziwy fragment kodu, który również zmienia niektóre dane.

Jeśli nie potrzebujesz transakcji, Twój kod może zostać dodatkowo zredukowany do:

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

AKTUALIZUJ

Niebezpiecznym podejściem byłoby jednak niekontrolowanie końca poprzedniego żądania, co również może powodować problemy z pamięcią/połączeniem.

Bezpiecznym podejściem powinno być:

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

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

            setTimeout(poll, 55);
        });
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Usługa bazy danych PostgreSQL

  2. Jak wygenerować schemat z pliku CSV dla kopii PostgreSQL?

  3. Jak mogę połączyć arkusz kalkulacyjny Google z PostgreSQL?

  4. Wyświetl błąd w PostgreSQL

  5. Wdrażanie przyrostowych aktualizacji klienta z rowversions w Postgres