2010-10-10 44 views
4

为什么直到$ sth-> execute完成之后,这段代码才执行信号处理程序?更重要的是,我该如何解决它?如何获得DBD :: Pg可靠超时?

#!/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 "[email protected]" if [email protected]; 
}; 
die "[email protected]" if [email protected]; 
print "Finished\n"; 

回答

2

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

+1

是的,我也试过。不幸的是,在没有冻结在同一个地方的情况下,没有办法等待相同的查询。也就是说,除非我想使用睡眠循环,这会增加不必要的延迟。 – Flimzy 2010-10-10 05:05:42

1

由于Perl的信号处理方式的改变(所谓的“安全信号”为5.8.0),你需要使用Perl::Unsafe::Signals,让您的die()上班的时候$sth->execute正在进行中。

1

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

相关问题