2010-10-10 62 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之上重寫你的應用/腳本。

相關問題