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

标签 php multithreading oracle oracle12c

我已在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/

相关文章:

python - hotshot可以在多线程中使用吗?

c# - 系统线程: Cross-thread operation not valid

多线程文本处理的成本/ yield

sql - 甲骨文 SQL : Most efficient way to calculate Z-score of grouped data

oracle - 转换逗号分隔的 VARCHAR 以在 PL/SQL 的 IN 子句中使用?

php - 如何将两个查询放在一个 mysql_query 中?

php pdo 代码附加 no 和日期

mysql - Oracle - 返回具有 max_date 重复项的行

使用 GET 在 mySql 查询上使用 PHP Zend_Paginator

php - 打开购物车显示已弃用 : mysql_connect() message on top