Задать вопрос
@chelius_ua

Как реализовать потоки в данном примере?

Добрый день, по работе пришлось столкнуться с 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();
  • Вопрос задан
  • 181 просмотр
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@QuakeMan
а почему через thread основной скрипт не дожидался выполнения?
есть такая штука как join
Ответ написан
Комментировать
parserpro
@parserpro
В вашем случае я бы посмотрел на https://metacpan.org/pod/AnyEvent::DBI.
А потоки в перле очень не рекомендуется использовать.
Ответ написан
Комментировать
@Pilat
Проще всего запустить три копии скрипта архивации, каждый из которых будет записывать время завершения. Последний из выполнившихся запишет время завершения всей архивации.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы