我已在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 current operation in C:\xampp\htdocs...\file.php on line 13
Warning: oci_execute(): ORA-03117: two-task save area overflow in C:\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/