2010-10-10 20 views
4

Pourquoi ce code n'exécute-t-il pas le gestionnaire de signal avant la fin de $ sth-> execute? Et plus important encore, comment puis-je le réparer?Comment puis-je obtenir un délai d'attente DBD :: Pg fiable?

#!/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"; 

Répondre

2

Envisagez d'utiliser la fonctionnalité asynchronous query de Pg à la place.

+1

Oui, j'ai aussi essayé. Malheureusement, il n'y a aucun moyen d'attendre la même requête sans geler au même endroit. C'est, à moins que je veux utiliser une boucle de sommeil, ce qui ajoute des retards inutiles. – Flimzy

1

En raison des changements dans la façon dont les signaux Perl (appelés « signaux sûrs » comme de 5.8.0), vous devrez utiliser Perl::Unsafe::Signals pour permettre à votre die() de travailler quand $sth->execute est en cours.

1

Il est AnyEvent::Pg qui permet d'interroger PostgreSQL de manière asynchrone, cependant, il n'est pas compatible DBI et il vous forcera à réécrire votre application/script sur le dessus de AnyEvent.