Подключение к нескольким базам данных в Perl-скрипте - PullRequest
0 голосов
/ 07 марта 2012

Как я могу подключиться к нескольким базам данных в Perl без его спасения, если он не может подключиться к одной? Если у меня есть имена баз данных в массиве, и я делаю их в цикле, я хочу попробовать подключиться, выполнить запрос и отключиться. Я собираюсь сообщить об этом на странице мониторинга старшего брата у нас. Я не хочу, чтобы скрипт завершал работу, если он не может подключиться к нему, так как он, очевидно, должен проверять все в массиве. Сейчас я использую метод состояния модулей DBI, но я не знаю, работает ли он правильно. Спасибо всем за время!

Ответы [ 3 ]

1 голос
/ 07 марта 2012

Можем ли мы увидеть код?Я не думаю, что вызов 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 голосов
/ 08 марта 2012

У меня есть имена баз данных в массиве, и я делаю их в цикле, я хочу попробовать подключиться, выполнить запрос и отключиться.

Если вы зацикливаетесь, нет причин открывать несколько баз данных. В вашем цикле откройте базу данных, сделайте свое дело и закройте.

Как я могу подключиться к нескольким базам данных в Perl без его выхода, если он не может подключиться к одной?

Я предполагаю, что это в вашем цикле. Вы всегда можете использовать eval всякий раз, когда выполняете любую команду Perl, которая может привести к ошибке и остановить выполнение вашей программы.

Вы делаете что-то вроде этого:

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. Однако значение по умолчанию не должно быть установлено, поэтому у вас не должно быть проблем.

0 голосов
/ 07 марта 2012

Вы должны посмотреть обработку исключений в Perl.Я не использую Perl, поэтому я не знаю синтаксиса для обработки исключений, хотя его достаточно легко найти в Интернете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...