PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Възел, извикващ функция postgres с временни таблици, причиняващи изтичане на памет

Тогава не ги използвайте. Все още можете да изпълнявате заявки директно, както е показано по-долу.

Това не е напълно грешен подход, просто е много неудобен, тъй като се опитвате да създадете нещо, което е внедрено от други за много по-лесна употреба. В резултат на това правите много грешки, които могат да доведат до много проблеми, включително изтичане на памет.

Сравнете с простотата на точно същия пример, който използва 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

Става още по-просто, когато се използва синтаксис на 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

Единственото нещо, което не разбрах съвсем във вашия пример - използването на транзакция за изпълнение на един SELECT . Транзакциите обикновено не са за това, тъй като не променяте никакви данни. Предполагам, че сте се опитвали да свиете истинска част от кода, който сте имали, който също променя някои данни.

В случай, че не се нуждаете от транзакция, вашият код може да бъде намален допълнително до:

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

АКТУАЛИЗАЦИЯ

Би било опасен подход обаче да не се контролира краят на предишната заявка, което също може да създаде проблеми с паметта/връзката.

Безопасен подход трябва да бъде:

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. sql генерира уникално име на таблица/изглед

  2. Как да заредите данни в pandas от голяма база данни?

  3. Предотвратяване на празни низове в полето CHARACTER VARYING

  4. Java SQL ГРЕШКА:Връзка Table_Name не съществува

  5. При вмъкване:референтният резултат на колона е двусмислен