如果无法连接到一个数据库,如何连接到perl中的多个数据库?如果我在一个数组中有数据库名称并在循环中通过它们,我想尝试连接并执行查询并断开连接。我将把它报告给我们的大哥服务器监控页面。如果脚本无法连接到脚本,我不希望脚本终止,因为它显然需要检查数组中的每个脚本。现在我使用DBI模块状态方法,但我不知道它是否正常工作。谢谢大家的时间!
答案 0 :(得分: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
}
}
答案 1 :(得分:0)
您应该在Perl中查找异常处理。我不使用Perl所以我不知道异常处理的语法,应该很容易在线查找。
答案 2 :(得分:0)
我在一个数组中有数据库名称,然后循环播放它们,我想尝试连接并执行查询并断开连接。
如果您正在循环,则没有理由打开多个数据库。在你的循环中,打开一个数据库,做你的东西,然后关闭。
如果无法连接到一个数据库,如何连接到perl中的多个数据库?
我假设这是在你的循环中。每当您执行任何可能出错的Perl命令并停止执行程序时,您始终可以使用eval
。
你做这样的事情:
for my $database (@database_list) {
my $dbh;
eval {
$dbh = DBI->connect($database, $user, $password);
};
if (not $@) {
yadda, yadda, yadda
}
}
eval
将捕获任何类型的普通致命错误。如果$@
有值,则调用失败,eval
返回错误说明。如果$@
为空,则没有错误,您只需继续。
HOWEVER ,默认情况下,如果无法连接,DBI不会自动死亡。相反,它只返回一个未定义的值。您应该能够使用它来确定您是否已成功,或者需要转到下一个数据库:
for my $database (@database_list) {
my $dbh = DBI->connect($database, $user, $password);
if ($dbh) {
yadda, yadda, yadda
}
}
如果我没记错的话,有一个名为RaiseError的属性如果设置将导致程序在失败的DBI调用中死亡。但是,默认值不应设置,因此您不应该遇到任何问题。