Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl DBI连接和执行超时_Perl_Oracle11g_Dbi - Fatal编程技术网

Perl DBI连接和执行超时

Perl DBI连接和执行超时,perl,oracle11g,dbi,Perl,Oracle11g,Dbi,在工作中,我们有一位DBA说他的RAC工作得很好,但事实并非如此。像Toad或SQL Developer这样的SQL IDE会随机删除它们的连接(我的怀疑是因为RAC的网络设置不正确)。 我想通过测试来证明我的理论。我想perl脚本会起到以下作用: 第一步。ping db的IP 第二步。如果IP已打开,请尝试连接到数据库 第三步。如果已连接,请从双重选择sysdate并关闭连接 第四步。等待一段时间,然后重新开始 我已经设法使用DBI在Perl中编写了这篇文章,但我不知道如何超时连接和查询执行。

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

第一步。ping db的IP

第二步。如果IP已打开,请尝试连接到数据库

第三步。如果已连接,请从双重选择sysdate并关闭连接

第四步。等待一段时间,然后重新开始


我已经设法使用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处理程序或非本地报警处理程序,则会导致死亡 被叫来