2011-11-24 37 views
6

私は、PostgreSQL 9.1データベースに "article"テーブルがあり、各挿入物のチャンネルに通知するトリガを持っています。node-postgresでLISTENクエリのタイムアウトが発生しましたか?

これらの挿入をキャッチし、Socket.ioを使用して接続されたクライアントに通知をプッシュするnode.jsスクリプトを作成したいとします。これまではnode-postgresモジュールを使ってチャンネルにLISTENを行っていましたが、LISTENクエリが約10-15秒後にタイムアウトして挿入を捕捉するのを止めるようです。タイムアウトが発生したときに新しいリッスンを照会できましたが、継続を正しく実装する方法がわかりません。

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

、説明付きの完全な例:[LISTEN/NOTIFY](https://github.com/vitaly-t/pg-promise/wiki/Learn-by-Example#listen--notify) –

答えて

8

私はnode-postgres repoで私の問題を解決しました。 Briancを引用するには:

pg.connectはプールされた接続を作成するために使用します。リスンイベントのための接続を使用している プール接続は実際にはサポートされていませんまたは良い アイデア。 [...] 定義によって接続を「聴く」には、恒久的に開いたままにしておく必要があります。 接続を永続的に開いたままにしておくと、接続プール に戻すことはできません。

このケースで聴くための正しい方法は、スタンドアロンクライアントを使用することです:[PG-約束](https://github.com/vitaly-t/pg-promise)を使用して

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では、IIRCはNOTIFYごとに1つの通知を提供する約束をしていないことに注意してください。挿入が多い場合は、NOTIFYを1つ配信することを選択できます。 9.1についてはわからないが、彼らはLISTENペイロードを導入しているため、やや意味がないかもしれない。

+0

15秒のタイムアウトはクライアントです問題?私はノードポストグルでそれを解決できますか、あるいは私がやりたいことに対して良いアプローチをしていないのですか? – lheurt

+0

私は実際にノードの部分に精通していませんし、コードを投稿した後、この環境全体とpgで何が起こるかを完全に理解しているかどうかわかりません... –

関連する問題