从postgresql中的表中流式传输数据的有效方法?

时间:2016-06-17 02:32:54

标签: postgresql streaming push postgresql-9.5

我有一个Log表,只附加一些我希望流回客户端的数据。

是否存在仅使用PG而不进行轮询来从中传输数据的方法?

所以我可以得到:

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

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

添加一个调用NOTIFY的触发器,然后让您的客户listen加入该频道。

这里有一些关于Listen和Notify的重要注意事项,但它们可以完全按照您的要求进行操作。例如,没有安全权限检查谁可以发送通知,因此不要依赖有效负载。

我的方法是:

  1. LISTEN(首先是防止竞争条件)
  2. 阅读表格。存储最新的时间戳,序列ID或其他递增值
  3. 收到通知后,查询表以获取所有后续行。永远重复。
  4. 再次,您可以通过notify发送行数据,但是如果他们可以连接到数据库,任何人都可以发送您的应用程序行数据,这对我来说有点危险。