代码之家  ›  专栏  ›  技术社区  ›  Jonathan Hall

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

  •  4
  • Jonathan Hall  · 技术社区  · 15 年前

    #!/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 回复  |  直到 15 年前
        1
  •  2
  •   ysth    15 年前

    考虑使用Pg asynchronous query

        2
  •  1
  •   Yaroslav    13 年前

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

        3
  •  1
  •   salva    10 年前

    AnyEvent::Pg 这允许异步查询PostgreSQL,但是,它与DBI不兼容,它将迫使您重写应用程序/脚本 AnyEvent .

    推荐文章