2011-11-24 46 views
6

Tôi có một bảng "bài viết" trên cơ sở dữ liệu Postgresql 9.1 và một trình kích hoạt thông báo một kênh trên mỗi chèn.LISTEN thời gian chờ truy vấn với nút-postgres?

Tôi muốn tạo tập lệnh node.js để nắm bắt các chèn đó và đẩy thông báo cho khách hàng được kết nối bằng Socket.io. Cho đến nay tôi đang sử dụng mô-đun nút-postgres để LISTEN vào kênh nhưng có vẻ như lần truy vấn LISTEN ra sau khoảng 10-15 giây và ngừng bắt các chèn. Tôi có thể truy vấn một bản nghe mới khi thời gian chờ xảy ra, nhưng tôi không chắc chắn làm thế nào để thực hiện đúng việc tiếp tục.

Dưới đây là thủ tục thông báo postgresql của tôi:

CREATE FUNCTION article_insert_notify() RETURNS trigger AS $$ 
BEGIN 
    NOTIFY "article_watcher"; 
    RETURN NULL; 
END; 
$$ LANGUAGE plpgsql; 

Trigger:

CREATE TRIGGER article_insert_trigger 
AFTER INSERT ON article 
FOR EACH ROW EXECUTE PROCEDURE article_insert_notify(); 

Và mã Node.js:

var pg = require ('pg'), 
    pgConnection = "postgres://user:[email protected]/db" 

pg.connect(pgConnection, function(err, client) { 
    client.query('LISTEN "article_watcher"'); 
    client.on('notification', function(data) { 
     console.log(data.payload); 
    }); 
}); 

Làm thế nào tôi có thể đảm bảo một fulltime LISTEN hoặc làm thế nào tôi có thể bắt những thời gian chờ đó để phát hành lại một truy vấn nghe không? Hoặc có thể một mô-đun khác ngoài nút-postgres cung cấp các công cụ thích hợp hơn để làm như vậy?

+0

Sử dụng [pg-lời hứa] (https://github.com/vitaly-t/pg-promise) , ví dụ đầy đủ với các giải thích: [LISTEN/NOTIFY] (https://github.com/vitaly-t/pg-promise/wiki/Learn-by-Example#listen--notify) –

Trả lời

8

Tôi đã nhận được câu trả lời cho vấn đề của mình trên repo nút-postgres. Để trích dẫn Brianc:

pg.connect được sử dụng để tạo kết nối gộp. Sử dụng kết nối kết nối hồ bơi cho các sự kiện nghe thực sự không được hỗ trợ hoặc ý tưởng tốt là . [...] Để 'nghe' kết nối theo định nghĩa phải luôn mở vĩnh viễn. Đối với kết nối để luôn mở vĩnh viễn, không bao giờ có thể quay trở lại hồ kết nối .

Cách đúng để lắng nghe trong trường hợp này là sử dụng một khách hàng độc lập:

var pg = require ('pg'), 
    pgConnectionString = "postgres://user:[email protected]/db"; 

var client = new pg.Client(pgConnectionString); 
client.connect(); 
client.query('LISTEN "article_watcher"'); 
client.on('notification', function(data) { 
    console.log(data.payload); 
}); 
0

LISTEN được cho là sẽ kéo dài suốt đời hoặc cho đến khi bạn thực hiện UNLISTEN. Vì vậy, miễn là mã của bạn đang chạy, thông báo sẽ được gửi. Lưu ý, rằng IIRC, postgresql không hứa hẹn sẽ gửi một thông báo cho mỗi NOTIFY - nếu bạn có nhiều lần chèn, nó có thể chọn để cung cấp một đơn NOTIFY. Không chắc chắn khoảng 9,1, họ đã giới thiệu tải trọng LISTEN, do đó, nó có thể làm cho một chút ít ý nghĩa.

+0

Sau đó, thời gian chờ 15 giây là một khách hàng vấn đề ? Tôi có thể giải quyết điều đó với các nút postgres hoặc tôi chỉ không có cách tiếp cận tốt cho những gì tôi muốn làm? – lheurt

+0

Tôi không thực sự quen thuộc với phần nút và tôi không chắc tôi hoàn toàn hiểu những gì xảy ra với pg và toàn bộ môi trường này sau khi mã được đăng ... –

Các vấn đề liên quan