2016-06-17 8 views
2

私はログテーブルを持って、私はクライアントに戻ってストリーミングしたいいくつかのデータで、唯一の追加。効率的な方法はありますか?

は、ポーリングなしのみPGを使用して、そこからデータをストリームする方法は存在し?

だから私は得ることができます:

1. Inv.Add 1, T=10 
.. some seconds after, the server push? 
2. Inv.Add 2, T=15 

答えて

0

そのチャンネルにあなたのクライアントlistenを持って、その後NOTIFYを呼び出し、トリガーを追加します。

ここでは、ListenとNotifyでいくつかの巨大な警告がありますが、あなたがしたいことを正確に行うためにそこにあります。たとえば、通知を送信することができますので、何のためのペイロードに依存していない人には何のセキュリティ権限のチェックはありません。

私のアプローチは次のようになります。

  1. は、テーブルを読んで(最初の競合状態を防ぐため)
  2. LISTEN。最新のタイムスタンプ、シリアルID、またはその他のインクリメント値を格納する
  3. 通知を受け取ったら、後のすべての行についてテーブルを照会します。永遠に繰り返す。

もう一度notifyで行データを送信できますが、誰かがデータベースに接続して危険な状態になった場合、誰でもアプリケーション行データを送信できます。

0

PostgreSQLは任意の操作を開始するためのいずれかの方法がありません。すべてのアクティビティは、外部イベントによってトリガされる必要があります。

あなたが挿入された行の値から出力をフォーマットするために、テーブルの上にplperluトリガを追加し、指定されたログファイルに追加することができました。

CREATE OR REPLACE FUNCTION tf_log_to_file() RETURNS trigger AS 
$BODY$ 
    use strict; 
    use Time::HiRes qw(time); 
    use POSIX qw(strftime); 

    my $t = time; 
    my $date = strftime "%Y%m%d %H:%M:%S", localtime $t; 
    $date .= sprintf ".%03d", ($t-int($t))*1000; 
    my $contents = $date . ' Inv.Add ' . $_TD->{new}{yourcolname}; 

    my $file = "/var/log/mylog.log"; 
    open(my $out, '>>', $file) or die "Unable to open or create file $file: $!"; 
    print $out decode_bytea($contents); 
    close($out); 

$BODY$ LANGUAGE plperlu VOLATILE SECURITY DEFINER; 

CREATE TRIGGER t_log_to_file AFTER INSERT ON yourtable 
    FOR EACH ROW EXECUTE PROCEDURE tf_log_to_file(); 
関連する問題