【问题标题】:Connecting to multiple databases in a perl script在 perl 脚本中连接到多个数据库
【发布时间】:2012-03-08 04:39:15
【问题描述】:

如果无法连接到一个数据库,如何在 perl 中连接到多个数据库而不会退出?如果我有一个数组中的数据库名称并循环遍历它们,我想尝试连接并执行查询并断开连接。我准备反馈给我们的老大哥服务器监控页面。我不希望脚本在无法连接到一个时终止,因为它显然需要检查数组中的每个。现在我使用 DBI 模块状态方法,但我不知道它是否正常工作。感谢大家的时间!

【问题讨论】:

    标签: perl


    【解决方案1】:

    我们可以看到代码吗?我不认为对DBI->connect() 的调用会死掉,除非你明确告诉它,例如:

    DBI->connect($dsn, $user, $pass) or die "Can't connect: $DBI::errstr\n";
    

    我很确定即使使用 {RaiseError => 1} 也不会让它自动死亡。所以,如果你打电话给or die...,请不要这样做!

    编辑:

    鉴于@squiguy 发布的代码,我会这样做:

    foreach my $host (@hosts) { 
        $dbh = DBI->connect("dbi:Oracle:; host=$host; port=$port", $username, $password); 
        next unless $dbh;
        if ($dbh->state()) {
            # Do stuff with state information
        }
    }
    

    【讨论】:

    • foreach my $host (@hosts) { $dbh = DBI->connect("dbi:Oracle:; host=$host; port=$port", $username, $password); if ($dbh->state()) 我基本上是在执行连接,然后我使用状态来查看它是否连接。这似乎对我不起作用。如果你明白我想要做什么或者我需要解释更多,请告诉我。谢谢
    • 如果连接失败,$dbh 将未定义,$dbh->state() 调用将是一个致命的运行时错误。请改用if ($dbh && $dbh->state()) ...
    • 是的,选择@mob 答案。您还可以将它们分解为单独的测试,这样您就可以判断您是否无法连接,或者状态是否正在重新调整错误值。
    • 感谢您的意见,我想我将不得不修改它,看看会发生什么。
    【解决方案2】:

    您应该在 Perl 中查找异常处理。我不使用 Perl,所以我不知道异常处理的语法,不过应该很容易在网上找到。

    【讨论】:

    • 我对如何做到这一点非常熟悉,但我找不到任何异常可以继续进行,它们似乎都退出了。感谢您的意见
    【解决方案3】:

    我有一个数组中的数据库名称,并在一个循环中遍历它们,我想尝试连接并执行查询并断开连接。

    如果您正在循环,则没有理由打开多个数据库。在你的循环中,打开一个数据库,做你的事情,然后关闭。

    如何在 perl 中连接到多个数据库,如果它无法连接到一个数据库,它不会退出?

    我假设这是在您的循环中。每当您执行任何可能出错并阻止程序执行的 Perl 命令时,您始终可以使用 eval

    你做这样的事情:

    for my $database (@database_list)  {
       my $dbh;
       eval {
           $dbh = DBI->connect($database, $user, $password);
       };
       if (not $@) {
            yadda, yadda, yadda
       }
    }
    

    eval 将捕获任何类型的普通致命错误。如果$@ 有值,则调用失败,eval 返回错误描述。如果$@ 为空,则没有错误,您可以继续。

    但是,默认情况下,DBI 在无法连接时不会自动死机。相反,它只返回一个未定义的值。您应该能够使用它来确定您是否成功,或者是否需要转到下一个数据库:

               for my $database (@database_list)  {
       my $dbh = DBI->connect($database, $user, $password);
       if ($dbh) {
            yadda, yadda, yadda
       }
    }
    

    如果我没记错的话,有一个名为RaiseError 的属性,如果设置它会导致您的程序在失败的 DBI 调用中死掉。但是,不应设置默认值,因此您应该没有任何问题。

    【讨论】:

    • 我会试一试,看看会发生什么,感谢您为我指出这一点。
    猜你喜欢
    • 2016-05-06
    • 2015-11-27
    • 2015-09-07
    • 1970-01-01
    • 2012-05-13
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多