2010-10-10 2 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

1

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

1

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