PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Node memanggil fungsi postgres dengan tabel temp yang menyebabkan kebocoran memori

Maka jangan gunakan mereka. Anda masih dapat menjalankan kueri secara langsung, seperti yang ditunjukkan di bawah ini.

Ini bukan pendekatan yang sepenuhnya salah, ini hanya pendekatan yang sangat canggung, karena Anda mencoba membuat sesuatu yang telah diterapkan oleh orang lain untuk penggunaan yang jauh lebih mudah. Akibatnya, Anda membuat banyak kesalahan yang dapat menyebabkan banyak masalah, termasuk kebocoran memori.

Bandingkan dengan kesederhanaan contoh yang sama persis yang menggunakan 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

Menjadi lebih sederhana saat menggunakan sintaks 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

Satu-satunya hal yang saya tidak begitu mengerti dalam contoh Anda - penggunaan transaksi untuk mengeksekusi satu SELECT . Ini bukan tujuan transaksi pada umumnya, karena Anda tidak mengubah data apa pun. Saya berasumsi Anda mencoba mengecilkan bagian kode asli yang Anda miliki yang juga mengubah beberapa data.

Jika Anda tidak memerlukan transaksi, kode Anda dapat dikurangi lebih lanjut menjadi:

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

PERBARUI

Namun, akan menjadi pendekatan yang berbahaya jika tidak mengontrol akhir dari permintaan sebelumnya, yang juga dapat menimbulkan masalah memori/koneksi.

Pendekatan yang aman harus:

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. Menggunakan alat hibernasi untuk merekayasa balik pojo dari Postgres

  2. kesalahan penyandian postgres di aplikasi sidekiq

  3. Postgresql dan jsonb - memasukkan kunci/nilai ke dalam array multi-level

  4. PGError:tidak ada koneksi ke server setelah idle

  5. postgresql bergabung dengan 2 tabel