gpt4 book ai didi

php - PHP的线程与oracle错误: two-task save area overflow

转载 作者:行者123 更新时间:2023-12-03 13:03:51 25 4
gpt4 key购买 nike

我已在php中启用了Threads,因此我可以同时执行多个任务,目标是将数据从Oracle服务器(12C)提取到本地。
为什么在线程上?因为在某些时候我们希望处理几个表之间的约5亿条记录,所以我想同时提取数据以尽量减少处理时间。
这是我的php代码:

<?php

//*************Thread 1
class table1Class extends Thread{
public $bdconn;
public function __construct($bdconn) {
$this->bdconn = $bdconn;
}

public function run(){
$stTable1 = oci_parse($this->bdconn, 'INSERT INTO TABLE_1
SELECT * FROM TABLE_1@DBLINK');
oci_execute($stTable1); //******* LINE 13
}
}

//***********Thread 2
class table2Class extends Thread{
public $bdconn;
public function __construct($bdconn) {
$this->bdconn = $bdconn;
}

public function run(){
$stTable2 = oci_parse($this->bdconn, 'INSERT INTO TABLE_2
SELECT * FROM TABLE_2@DBLINK');
oci_execute($stTable2); //****** LINE 27
}
}


function pad($val) {
return ($val > 9) ? $val : "0".$val;
}


$start= microtime(true); //time

require_once '../../lib/bd_con.php';
$bdconn= conBd(); //open connection

/**********TRUNCATE LOCAL TABLES*/
$trunPref= oci_parse($bdconn, 'TRUNCATE TABLE TABLE_1');
oci_execute($trunPref);

$trunCruz= oci_parse($bdconn, 'TRUNCATE TABLE TABLE_2');
oci_execute($trunCruz);
/************END*/


//***********BEGIN THREADS
$table1 = new table1Class($bdconn);
$table1->start();

$table2 = new table2Class($bdconn);
$table2->start();


//*********WAINT FOR THREADS TO END
$table1->join();
$table2->join();


oci_close($bdconn); //close connection

//PRINT TIME INFORMATION
$end= microtime(true); //al final del archivo
$tiempo_segundos = number_format($end-$start,4);
echo pad(((Int)($tiempo_segundos/60))).":".pad(((Int)($tiempo_segundos%60)))." minutes";
这是我执行的错误:

Warning: oci_execute(): ORA-01013: user requested cancel of currentoperation in C:\xampp\htdocs...\file.php on line 13

Warning: oci_execute(): ORA-03117: two-task save area overflow inC:\xampp\htdocs...\file.php on line 27


对代码的作用的一个简短解释是:截断我的本地表并执行两个线程以使用dblink从oracle服务器再次插入数据。
如果有人可以给我一个解决方法的建议,我将不胜感激。

最佳答案

我有同样的错误,但在python中。显然,它是在两个不同的线程共享相同的oracle连接时产生的。

“相同”是指完全相同的连接对象:如果您打开两个不同的连接(尽管它们具有相同的用户名和密码),则不会有任何问题。

为了避免此问题,每个线程仅使用一个连接对象:您也可以使用连接池来完成此操作。

关于php - PHP的线程与oracle错误: two-task save area overflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38447591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com