2012-03-07 64 views
0

如何连接到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 
    } 
} 
+0

'foreach my $ host if($ dbh-> state())' 我基本上正在执行连接,然后使用状态来查看它是否连接。这似乎不适用于我。如果你得到了我想要做的或者我需要解释更多,请告诉我。谢谢 – squiguy 2012-03-07 19:14:31

+1

如果连接失败,'$ dbh'将会是未定义的,'$ dbh-> state()'调用将是一个致命的运行时错误。说'if($ dbh && $ dbh-> state())...'来代替。 – mob 2012-03-07 20:16:35

+0

是的,用@mob回答。你也可以把它们分解成单独的测试,这样你就可以判断你是否无法连接,或者如果状态重新调整一个错误的值。 – 2012-03-07 20:24:24

0

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

+0

我非常熟悉如何做到这一点,但我无法找到任何异常继续通过,他们都似乎退出。(@hosts){dbh = DBI-> connect(“dbi:Oracle :; host = $ host; port = $ port”,$ username,$ password);感谢您的输入,尽管 – squiguy 2012-03-07 18:58:20

0

我在数组中的数据库名称和走线槽他们在一个循环中,我想尝试连接并执行查询并断开连接。

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

如何连接到perl中的多个数据库,如果它无法连接到一个数据库,则无需保存数据库?

我假设这是在你的循环中。无论何时执行任何可能会出错的Perl命令并停止执行程序,都可以始终使用eval

你做这样的事情:

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

eval将捕捉任何类型的普通致命的错误。如果[email protected]有值,则呼叫失败,并且eval返回错误说明。如果[email protected]为空,则无错误,您可以继续。

但是,默认情况下,如果DBI不能连接,DBI不会自动死亡。相反,它只是返回一个未定义的值。您应该能够用它来确定您是否已经成功,还是需要去到一个数据库:

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

如果我没有记错,有一个名为RaiseError的属性,如果集将导致程序死在失败的DBI调用中。但是,应该不设置默认值,所以你不应该有任何问题。

+0

我会给这个镜头,看看会发生什么,谢谢你为我指出。 – squiguy 2012-03-07 21:21:17