PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Nút gọi hàm postgres với bảng tạm thời gây rò rỉ bộ nhớ

Sau đó, không sử dụng chúng. Bạn vẫn có thể thực hiện các truy vấn trực tiếp, như được hiển thị bên dưới.

Đó không phải là một cách tiếp cận hoàn toàn sai, nó chỉ là một cách rất khó xử, vì bạn đang cố gắng tạo ra thứ gì đó được người khác triển khai để sử dụng dễ dàng hơn nhiều. Do đó, bạn đang mắc nhiều sai lầm có thể dẫn đến nhiều vấn đề, bao gồm cả rò rỉ bộ nhớ.

So sánh với sự đơn giản của cùng một ví dụ chính xác sử dụng 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

Thậm chí còn đơn giản hơn khi sử dụng cú pháp 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

Điều duy nhất mà tôi không hiểu rõ trong ví dụ của bạn - việc sử dụng một giao dịch để thực hiện một SELECT duy nhất . Đây không phải là những gì giao dịch nói chung, vì bạn không thay đổi bất kỳ dữ liệu nào. Tôi giả sử rằng bạn đang cố gắng thu nhỏ một đoạn mã thực sự mà bạn có để thay đổi một số dữ liệu.

Trong trường hợp bạn không cần giao dịch, mã của bạn có thể được giảm thêm thành:

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

CẬP NHẬT

Tuy nhiên, đây sẽ là một cách tiếp cận nguy hiểm, không kiểm soát phần cuối của yêu cầu trước đó, điều này cũng có thể tạo ra các vấn đề về bộ nhớ / kết nối.

Một cách tiếp cận an toàn nên là:

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. Làm thế nào Now () Hoạt động trong PostgreSQL

  2. Duy trì múi giờ ở loại timestamptz PostgreSQL

  3. ECONNREFUSED cho Postgres trên nodeJS với dockers

  4. Sắp xếp tổng hợp văn bản được tạo bằng array_agg trong postgresql

  5. Dòng lệnh PSQL của Windows:có cách nào cho phép đăng nhập không cần mật khẩu không?