如何让DBD :: Pg可靠地超时?

时间:2010-10-10 03:13:59

标签: perl signals dbi

为什么在$ sth->执行完成之后,此代码才会执行​​信号处理程序?更重要的是,我该如何解决?

#!/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 个答案:

答案 0 :(得分:2)

请考虑使用Pg的asynchronous query功能。

答案 1 :(得分:1)

由于Perl处理信号的方式发生了变化(从5.8.0开始称为“安全信号”),您需要使用Perl::Unsafe::Signalsdie() $sth->execute工作{ {1}}正在进行中。

答案 2 :(得分:1)

AnyEvent::Pg允许以异步方式查询PostgreSQL,但它不兼容DBI,它会强制您在AnyEvent之上重写您的应用程序/脚本。