我有一個日誌表,僅附加一些數據,我希望將它們傳回客戶端。從postgresql中的表流式傳輸數據的有效方法?
存在一種方法來從它流數據只使用PG沒有輪詢?
這樣我就可以得到:
1. Inv.Add 1, T=10
.. some seconds after, the server push?
2. Inv.Add 2, T=15
我有一個日誌表,僅附加一些數據,我希望將它們傳回客戶端。從postgresql中的表流式傳輸數據的有效方法?
存在一種方法來從它流數據只使用PG沒有輪詢?
這樣我就可以得到:
1. Inv.Add 1, T=10
.. some seconds after, the server push?
2. Inv.Add 2, T=15
添加這就要求NOTIFY
觸發,然後讓你的客戶listen
到該通道。
Listen和Notify有一些巨大的注意事項,但他們確實在做你想做的事情。例如,對誰可以發送通知沒有安全權限檢查,因此不要依賴任何有效負載。
我的做法是:
您可以再次通過通知發送行數據,但任何人都可以發送您的應用程序行數據,如果他們可以連接到數據庫,這有點危險。
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();