我有一个并行运行的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), ?, ?, ?, ?, ?, ?, ?, ?, ?)
我想问题是ID列正在插入增量值。
(SELECT NVL(MAX(ID)+1, 1)
,并且另一个脚本实例已经在插入相同的ID。
我尝试更改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.
});
当脚本不是并行运行时,一切都可以。我不想在并行运行脚本之前生成这些ID。
答案 0 :(得分:0)
假设您要在此处进行的操作是为了加快数据加载速度,那么最好使用sqlldr工具(Oracle批量加载工具)。
几乎可以肯定,这是不受IO约束的,将插入语句放在多个内核中不会使它变得更快,并且会产生新的问题,如您上面提到的那样。