从 postgresql 中的 table 流式传输数据的有效方法?
Efficient way to stream data from a table in postgresql?
我有一个日志 table,仅附加,其中包含一些我希望流式传输回客户端的数据。
是否存在一种仅使用 PG 而无需轮询从中流式传输数据的方法?
所以我可以得到:
1. Inv.Add 1, T=10
.. some seconds after, the server push?
2. Inv.Add 2, T=15
PostgreSQL 无法启动任何操作。所有 activity 都必须由外部事件触发。
您可以在 table 上添加一个 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();
添加一个调用 NOTIFY
的触发器,然后让您的客户 listen
进入该频道。
这里有一些关于 Listen 和 Notify 的重要警告,但它们的作用正是按照您的意愿进行。例如,没有针对谁可以发送通知的安全权限检查,因此不要依赖负载来做任何事情。
我的方法是:
- LISTEN(首先防止竞争条件)
- 阅读table。存储最新的时间戳、序列号或其他增量值
- 收到通知后,查询 table 以获取所有后续行。永远重复。
同样,您可以通过通知发送行数据,但是如果他们可以连接到数据库,那么任何人都可以发送您的应用行数据,这让我觉得有点危险。
我有一个日志 table,仅附加,其中包含一些我希望流式传输回客户端的数据。
是否存在一种仅使用 PG 而无需轮询从中流式传输数据的方法?
所以我可以得到:
1. Inv.Add 1, T=10
.. some seconds after, the server push?
2. Inv.Add 2, T=15
PostgreSQL 无法启动任何操作。所有 activity 都必须由外部事件触发。
您可以在 table 上添加一个 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();
添加一个调用 NOTIFY
的触发器,然后让您的客户 listen
进入该频道。
这里有一些关于 Listen 和 Notify 的重要警告,但它们的作用正是按照您的意愿进行。例如,没有针对谁可以发送通知的安全权限检查,因此不要依赖负载来做任何事情。
我的方法是:
- LISTEN(首先防止竞争条件)
- 阅读table。存储最新的时间戳、序列号或其他增量值
- 收到通知后,查询 table 以获取所有后续行。永远重复。
同样,您可以通过通知发送行数据,但是如果他们可以连接到数据库,那么任何人都可以发送您的应用行数据,这让我觉得有点危险。