gpt4 book ai didi

Perl DBI 连接和执行超时

转载 作者:行者123 更新时间:2023-12-04 23:24:50 29 4
gpt4 key购买 nike

在工作中,我们有一个 DBA,他说他的 RAC 工作得很好,但事实并非如此。像 Toad 或 SQL Developer 这样的 SQL IDE 会随机断开它们的连接(我怀疑是因为 RAC 的网络设置不正确)。
我想通过测试来证明我的理论。我猜一个 perl 脚本可以解决问题:

步骤 1. ping 数据库的 IP

步骤 2. 如果 IP 已启动,则尝试连接到数据库

步骤 3. 如果已连接,则从双重连接中选择 sysdate 并关闭连接

步骤 4. 等待一段时间,然后重新开始

我已经设法使用 DBI 在 Perl 中编写了这个,但我不知道如何使连接和查询执行超时。是否有一些解决方案可以让这些事情超时?

最佳答案

您可以使用与 DBI 相关的信号来实现超时,使用 alarm()$SIG{ALRM} .
来自 DBI cpan 和 cpan pod 上的模块

Timeout

The traditional way to implement a timeout is to set $SIG{ALRM} torefer to some code that will be executed when an ALRM signal arrivesand then to call alarm($seconds) to schedule an ALRM signal to bedelivered $seconds in the future.


For example:

my $dbh = DBI->connect("DBI:SQLRelay:host=$hostname;port=$port;socket=",$user, $password) or die DBI->errstr;

my $sth = $dbh->prepare($query) or die $dbh->errstr;

  eval {
local $SIG{ALRM} = sub { die "TIMEOUT\n" }; # \n is required
eval {
alarm($seconds);
if(! $sth->execute() ) { # execute query
print "Error executing query!\n"
}
};
# outer eval catches alarm that might fire JUST before this alarm(0)
alarm(0); # cancel alarm (if code ran fast)
die "$@" if $@;
};
if ( $@ eq "TIMEOUT\n" ) { ... }
elsif ($@) { ... } # some other error

The first (outer) eval is used to avoid the unlikely but possiblechance that the "code to execute" dies and the alarm fires before itis cancelled. Without the outer eval, if this happened your programwill die if you have no ALRM handler or a non-local alarm handler willbe called.

关于Perl DBI 连接和执行超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14759240/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com