Oracle DBD Вставка и обновление таблицы с использованием Perl-скрипта, работающего параллельно - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть Perl-скрипт, который запускается параллельно.

ls -lrt INCOMING | grep .out | head -${PARALLEL_COUNT} |  awk '{print $9}' | parallel "./new_control.pl" {}

Сценарий, обрабатывающий файлы CSV, которые отправляют данные сервера. Когда скрипт работает параллельно, у меня есть исключение

Uncaught exception from user code:
DBD::Oracle::st execute failed: ORA-00001: unique constraint (PRE.SYS_C006373) violated (DBD ERROR: OCIStmtExecute) [for Statement "INSERT INTO DISK
(
    ID,
    RECORD_ID,
    MOUNT_POINT,
    TOTAL_SIZE,
    USED,
    AVALIABLE,
    CAPACITY,
)
VALUES ((SELECT NVL(MAX(ID)+1, 1) FROM DISK), ?, ?, ?, ?, ?, ?, ?, ?, ?)

Полагаю, проблема в столбце идентификатора, в который вставляется увеличенное значение.

(SELECT NVL(MAX(ID)+1, 1)

и тот же идентификатор уже вставляется другим экземпляром скрипта.

Я пытался изменить AutoCommit, но без какого-либо положительного результата

our $dbh = DBI->connect("dbi:Oracle:host=$host;sid=$sid;port=$port", $username, $password,
{
    RaiseError => 1,
    AutoCommit => 1 # this will need to call commit manually (if value is 0) after changes in DB.
});

Когда скрипт не запускается параллельно, все в порядке. Я не хочу генерировать эти идентификаторы до того, как параллельно запусту скрипт.

1 Ответ

0 голосов
/ 02 ноября 2018

Если предположить, что вы пытаетесь выполнить загрузку данных быстрее, вам лучше использовать инструмент sqlldr (инструмент массовой загрузки oracle).

Помимо всего прочего, это почти наверняка связано с вводом-выводом, размещение операторов вставки в нескольких ядрах ничего не сделает для ускорения и создаст новые проблемы, подобные той, что у вас есть выше.

...