Perl DBI连接和执行超时
在工作中,我们有一位DBA说他的RAC工作得很好,但事实并非如此。像Toad或SQL Developer这样的SQL IDE会随机删除它们的连接(我的怀疑是因为RAC的网络设置不正确)。 我想通过测试来证明我的理论。我想perl脚本会起到以下作用: 第一步。ping db的IP 第二步。如果IP已打开,请尝试连接到数据库 第三步。如果已连接,请从双重选择sysdate并关闭连接 第四步。等待一段时间,然后重新开始Perl DBI连接和执行超时,perl,oracle11g,dbi,Perl,Oracle11g,Dbi,在工作中,我们有一位DBA说他的RAC工作得很好,但事实并非如此。像Toad或SQL Developer这样的SQL IDE会随机删除它们的连接(我的怀疑是因为RAC的网络设置不正确)。 我想通过测试来证明我的理论。我想perl脚本会起到以下作用: 第一步。ping db的IP 第二步。如果IP已打开,请尝试连接到数据库 第三步。如果已连接,请从双重选择sysdate并关闭连接 第四步。等待一段时间,然后重新开始 我已经设法使用DBI在Perl中编写了这篇文章,但我不知道如何超时连接和查询执行。
我已经设法使用DBI在Perl中编写了这篇文章,但我不知道如何超时连接和查询执行。有没有什么办法来解决这些事情 这似乎取决于您连接到的数据库后端。例如,是否记录了这样一个超时值: mysql\u连接\u超时
If your DSN contains the option "mysql_connect_timeout=##", the connect request to the server will timeout if it has not been
在给定的秒数后成功
但是,我没有看到针对Oracle的相同记录
我确实找到了一个关于信号处理的讨论。您可以使用与DBI相关的信号,使用
alarm()
和$SIG{ALRM}
实现超时
从cpan上的模块和
超时
实现超时的传统方法是将$SIG{ALRM}设置为
请参阅ALRM信号到达时将执行的一些代码
然后调用alarm($seconds)来计划要发送的ALRM信号
在未来交付$s
例如:
my$dbh=DBI->connect(“DBI:SQLRelay:host=$hostname;port=$port;socket=”,
$user,$password)或die DBI->errstr
我的$sth=$dbh->prepare($query)或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
第一次(外部)评估用于避免不太可能但可能发生的情况
“要执行的代码”消失并在此之前触发警报的可能性
取消了。没有外部评估,如果这发生在你的程序中
如果没有ALRM处理程序或非本地报警处理程序,则会导致死亡
被叫来