如果数据库连接失败,请尝试重新连接

时间:2011-03-14 11:39:07

标签: perl

我是perl的新手,我的情景是有一系列主机, 在循环中,我正在创建DNS并连接到数据库。   但是,如果任何主机没有响应或关闭,那么该循环正在中断 并且剩下的主机无法连接,我的问题是如何跳过它 意味着如果任何主机无法连接,那么我想跳过该主机,并希望与其他主机连接... 大家好 ,    我是perl的新手,我的情况是有一系列主机。

在循环中,我正在创建DNS并连接到数据库。   但是,如果任何主机没有响应或关闭,那么该循环正在中断

我的问题是如何跳过这个问题 意味着如果任何主机无法连接,那么我想跳过该主机并希望与其他主机连接......或者尝试再次重新连接该主机...  

下面给出了一段代码


@arr_ =('host1','host2');
foreach $host (@arr_){
   @Mydsn =("dbi:mysql:$MYSQL_DATABASE:$host:$MYSQL_PORT","$MYSQL_USER","$MYSQL_PWD");

my $my_connection = DBI->connect(@Mydsn, { RaiseError => 0, PrintError => 1 } ) or die("Fail to connect Database connection"); ### Here how can i skip if mysql is not able to connect with breaking execution of script

}

请帮帮我! 提前致谢    请帮帮我! 提前致谢

2 个答案:

答案 0 :(得分:2)

die立即停止脚本。请改用next。调整上面的代码:

my @arr = ('host1','host2');
foreach my $host (@arr){
    my @mydsn = ("dbi:mysql:$MYSQL_DATABASE:$host:$MYSQL_PORT","$MYSQL_USER","$MYSQL_PWD");
    my $my_con = DBI->connect(@Mydsn, { RaiseError => 0, PrintError => 1 } );
    if ( ! $my_con ) {
        warn "failed to connect to $host";
        next;
    }
}

在这种简单的情况下,next当然是不必要的。

答案 1 :(得分:0)

也许您可以先检查服务器是否处于活动状态,类似于:

use IO::Socket::INET;
@arr_ =('host1','host2');
foreach $host (@arr_) {
    $sk = IO::Socket::INET->new(PeerAddr => $host, 
                                PeerPort => '5432', # if postgres
                                Proto    => 'tcp' );
    if ($sk) {
        my $my_connection =  DBI->connect(@Mydsn, { RaiseError => 0, PrintError => 1 } ) 
                 or die("Fail to connect Database  connection");
    } 
}