Добрый день, по работе пришлось столкнуться с Perl и очень увлек он меня. Есть задача по архивации данных в БД Oracle, которую я смог реализовать с текущими знаниями, прикрутив выполнение .sql файла через sqlplus. Сейчас архивация происходит последовательно, а я хочу её распараллелить, что бы не плодить кучу файлов, хочется применить потоки в уже имеющемся коде. Но судя во всему я забежал немного вперед и мне какие-то вещи постигнуть еще сложно, поэтому прошу вашей помощи в правке моего готового кода.
Порядок работы следующий: при запуске sql файла происходит запись в БД о начале процесса архивации (назовем это логом), далее в цикле запускается архивация для каждой из указанных в массиве схем БД и производится запись в лог, по окончании цикла производится запись в лог о выполнении архивации.
Собственно вот и хочу то что в цикле запустить параллельно.
Удалось запустить через thread, async, но тогда основной скрипт не дожидался выполнения дочерних...
Спасибо!
#!/usr/bin/perl -w
use strict;
use DBI;
use DBD::Oracle;
my $archdate= 201506; #Ручная подстановка периода архивации
#Подключение к БД
my $dbh = DBI ->connect( 'dbi:Oracle:xe', 'hr', '159', {RaiseError => 1, AutoCommit => 1} );
my @connetction_log = ('user1/pass1@xe','user2/pass2@xe','user3/pass3@xe');
#Записываем начало выполнения арихвации в БД
my $sql = " INSERT INTO MS_ARCH_LOG VALUES ('HR ONE', '$archdate', SYSDATE, 0, 3,'0%', 'RUNNING', NULL) ";
my $sth = $dbh->prepare( $sql );
$sth->execute();
my $i;
foreach $i (@connetction_log) {
#С этого момента начинаем создавать потоки
system ("sqlplus", $i, "\@arc_data.sql", "$archdate");
my $sql = " UPDATE MS_ARCH_LOG SET DONE = DONE + 1, PCNT = ROUND((DONE+1)/TOTAL*100)||'%' WHERE DB = 'HR ONE' AND PERIOD = '$archdate' ";
my $sth = $dbh->prepare( $sql );
$sth->execute();
}
# Продолжаем выполнение скрипта когда все потоки закончили работу
$sql = " UPDATE MS_ARCH_LOG SET STATUS = 'DONE', COMPLITED = SYSDATE WHERE DB = 'HR ONE' AND PERIOD = '$archdate' ";
$sth = $dbh->prepare( $sql );
$sth->execute();