2011-11-24 4 views
6

PostgreSQL 9.1 데이터베이스에 "article"테이블이 있고 각 삽입시 채널에 알리는 트리거가 있습니다.LISTEN query timeout with node-postgres?

Socket.io를 사용하여 해당 삽입을 포착하고 연결된 클라이언트에게 알림을 푸시하는 node.js 스크립트를 만들고 싶습니다. 지금까지 채널에 LISTEN하기 위해 node-postgres 모듈을 사용하고 있지만 약 10-15 초 후에 LISTEN 쿼리 시간이 초과되어 삽입을 포착하는 것처럼 보입니다. 시간 초과가 발생하면 새 청취를 쿼리 할 수 ​​있지만 연속을 올바르게 구현하는 방법을 모르겠습니다.

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

트리거 :

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

그리고 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); 
    }); 
}); 

나는이 풀 타임 LISTEN 보장 할 수 방법 또는 방법

여기 내 PostgreSQL의 통지 절차입니다 청취 쿼리를 재발행하기 위해 타임 아웃을 잡을 수 있습니까? 또는 node-postgres가 아닌 다른 모듈이 더 적절한 도구를 제공 할 수 있습니까?

+0

을 [PG-약속 (https://github.com/vitaly-t/pg-promise) , 설명이있는 완전한 예제 : [LISTEN/NOTIFY] (https://github.com/vitaly-t/pg-promise/wiki/Learn-by-Example#listen--notify) –

답변

8

node-postgres repo에서 내 문제에 대한 답변을 얻었습니다. Brianc을 인용하려면 :

pg.connect는 풀링 된 연결을 만드는 데 사용됩니다. 수신 대기 이벤트에 대한 풀 연결 연결을 사용하는 것은 실제로 지원되지 않거나 좋은 아이디어입니다. [...] 연결을 '수신 대기'하려면 정의에 따라 영구히 열어 두어야합니다. 연결을 영구히 열어두면 연결 풀 으로 절대 되돌릴 수 없습니다.

이 경우 청취하는 올바른 방법은 독립 클라이언트에 사용하는 것이다 사용

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은 세션 기간 동안 또는 UNLISTEN까지 지속될 예정입니다. 따라서 코드가 실행되는 동안에는 알림을 전달해야합니다. postgresql은 많은 삽입이있는 경우 NOTIFY을 전달하기로 선택할 수 있습니다. NOTIFY에 대해 하나의 통지를 전달한다는 약속은 제공하지 않습니다. 9.1에 대한 확신이 없으므로, 그들은 LISTEN 페이로드를 도입 했으므로 다소 덜 이해할 수 있습니다.

+0

15 초 타임 아웃은 클라이언트입니다 문제? node-postgres로 해결할 수 있을까요 아니면 제가하고 싶은 일에 대해 좋은 접근 방식을 가지고 있지 않을까요? – lheurt

+0

나는 노드 부분을 잘 알고 있지 않으며 코드 게시 후이 전체 환경이 어떻게되는지 완전히 이해하고 있는지 잘 모르겠다. –