2016-06-17 3 views
2

У меня есть таблица журналов, добавьте только некоторые данные, которые я хочу передать клиентам.Эффективный способ потока данных из таблицы в postgresql?

Существуют ли способы передачи данных с него, используя только PG без опроса?

Так что я могу получить:

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

ответ

0

Добавить триггер, который вызывает NOTIFY и затем ваш клиент listen к этому каналу.

Здесь есть некоторые огромные оговорки, в которых вы можете прослушивать и уведомлять, но они должны делать именно то, что вы хотите сделать. Например, нет проверок разрешений безопасности для тех, кто может отправлять уведомления, поэтому не полагайтесь на полезную нагрузку для чего-либо.

Мой подход был бы:

  1. СЛУШАТЬ (первый для предотвращения гонки условий)
  2. Прочитайте таблицу. Сохраните последнюю метку времени, серийный идентификатор или другое добавочное значение.
  3. Когда вы получаете уведомление, запросите таблицу для всех последующих строк. Повторите навсегда.

Снова вы можете отправлять данные о строках с помощью уведомлений, но затем каждый может отправлять данные строки приложения, если они могут подключиться к db, и это наводит меня на опасность.

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();