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

发布于 2024-09-26 19:18:41 字数 585 浏览 3 评论 0原文

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

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

Why doesn't this code execute the signal handler until after $sth->execute completes? And more importantly, how can I fix it?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

任性一次 2024-10-03 19:18:41

考虑使用 Pg 的异步查询功能。

Consider using Pg's asynchronous query feature instead.

唱一曲作罢 2024-10-03 19:18:41

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

Due to changes in the way Perl handles signals (so-called "safe signals" as of 5.8.0), you'll need to use Perl::Unsafe::Signals to allow your die() to work when $sth->execute is in progress.

围归者 2024-10-03 19:18:41

AnyEvent::Pg 允许异步查询 PostgreSQL,但它与 DBI 不兼容它会迫使您在 AnyEvent 之上重写您的应用程序/脚本。

There is AnyEvent::Pg that allows to query PostgreSQL asynchronously, though, it is not DBI compatible and it will force you to rewrite your app/script on top of AnyEvent.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文