2013-02-07 90 views
3

在工作中,我们有一位DBA说他的RAC工作正常,但事实并非如此。像Toad或SQL Developer之类的SQL IDE会随机删除它们的连接(我的怀疑是由于RAC的错误的网络设置)。 我想用一个测试来证明我的理论。我想一个perl脚本将向招:Perl DBI连接并执行超时

步骤1平的分贝的IP

步骤2中,如果IP可达尝试连接到数据库

步骤3中,如果选择连接从SYSDATE双和关闭连接

步骤4等待一段时间,并启动它一遍又一遍

我设法使用DBI Perl编写代码,但我不知道我该怎么超时连接和查询执行。有没有解决这些事情的时机?

回答

2

它看起来取决于您连接的是哪个数据库后端。例如,DBD::mysql做记录这样的超时值:

mysql_connect_timeout

If your DSN contains the option "mysql_connect_timeout=##", the connect request to the server will timeout if it has not been 

成功的给定秒数之后。

但是,我没有看到为Oracle记录的同样的事情。

我的确发现了这样做的信号处理in the DBI documentation的讨论。

5

您可以使用与DBI相关的信号来实现使用alarm()$SIG{ALRM}的超时。

DBI模块CPAN和cpan pod

超时

实行超时传统的方法是设置$ SIG {ALRM}来 指一些代码,会被当ALRM执行信号到达 ,然后调用警报($秒)来安排ALRM信号在未来以$秒的形式发送到 。

例如:

我$胸径= DBI->连接( “DBI:SQLRelay:主机= $主机名;端口= $端口;插座=”, $用户,$密码)或死亡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 "[email protected]" if [email protected]; 
    }; 
    if ([email protected] eq "TIMEOUT\n") { ... } 
    elsif ([email protected]) { ... } # some other error 

第一(外)EVAL被用来避免不大可能出现,但可能 机会,“代码来执行”模具和之前 被取消火警。没有外部评估,如果发生这种情况,您的程序 将死亡,如果你没有ALRM处理程序或非本地警报处理程序将调用 。