【发布时间】:2012-03-08 04:39:15
【问题描述】:
如果无法连接到一个数据库,如何在 perl 中连接到多个数据库而不会退出?如果我有一个数组中的数据库名称并循环遍历它们,我想尝试连接并执行查询并断开连接。我准备反馈给我们的老大哥服务器监控页面。我不希望脚本在无法连接到一个时终止,因为它显然需要检查数组中的每个。现在我使用 DBI 模块状态方法,但我不知道它是否正常工作。感谢大家的时间!
【问题讨论】:
标签: perl
如果无法连接到一个数据库,如何在 perl 中连接到多个数据库而不会退出?如果我有一个数组中的数据库名称并循环遍历它们,我想尝试连接并执行查询并断开连接。我准备反馈给我们的老大哥服务器监控页面。我不希望脚本在无法连接到一个时终止,因为它显然需要检查数组中的每个。现在我使用 DBI 模块状态方法,但我不知道它是否正常工作。感谢大家的时间!
【问题讨论】:
标签: perl
我们可以看到代码吗?我不认为对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()) ...。
您应该在 Perl 中查找异常处理。我不使用 Perl,所以我不知道异常处理的语法,不过应该很容易在网上找到。
【讨论】:
我有一个数组中的数据库名称,并在一个循环中遍历它们,我想尝试连接并执行查询并断开连接。
如果您正在循环,则没有理由打开多个数据库。在你的循环中,打开一个数据库,做你的事情,然后关闭。
如何在 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 调用中死掉。但是,不应设置默认值,因此您应该没有任何问题。
【讨论】: