Как я могу получить надежный тайм-аут DBD :: Pg? - PullRequest
4 голосов
/ 10 октября 2010

Почему этот код не выполняет обработчик сигнала до тех пор, пока не завершится $ sth-> execute?И что еще более важно, как я могу это исправить?

#!/usr/bin/perl

use strict;
use warnings;

use DBI;
use Sys::SigAction qw( set_sig_handler );

my $dbh = DBI->connect('dbi:Pg:dbname=dc');

eval {
    my $h = set_sig_handler('ALRM', sub { die "timeout\n" });
    eval {
        alarm 1;
        my $sth = $dbh->prepare("SELECT pg_sleep(10)");
        print "Before execute\n";
        $sth->execute;
        print "After execute\n";
        $sth->finish;
    };
    alarm 0;
    die "$@" if $@;
};
die "$@" if $@;
print "Finished\n";

Ответы [ 3 ]

2 голосов
/ 10 октября 2010

Рассмотрите возможность использования вместо асинхронного запроса Pg .

1 голос
/ 08 октября 2012

Существует AnyEvent :: Pg , который позволяет асинхронно запрашивать PostgreSQL, однако он не совместим с DBI и заставит вас переписать ваше приложение / скрипт поверх AnyEvent .

1 голос
/ 08 октября 2012

Из-за изменений в способе, которым Perl обрабатывает сигналы (так называемые «безопасные сигналы», начиная с 5.8.0), вам потребуется использовать Perl :: Unsafe :: Signals , чтобы разрешить die() работать, когда $sth->execute выполняется.

...