亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 8164 | 回復: 25
打印 上一主題 下一主題

求助仙子:多進程操作oracle出錯,如何處理? [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-05-24 16:11 |只看該作者 |倒序瀏覽
本帖最后由 hnwcr 于 2010-05-25 10:43 編輯

問題:爹進程如果不sleep 則程序立即異常,sleep的話只有第一個子進程正常,sleep時間到后,整個程序異常。
請教這是為什么?????? 關鍵部份的代碼貼如下:
$oracle_dbh->{InactiveDestroy}=1; ##參考DBI文檔,設成常連
foreach (0..4) ###生成測試5個進程分別處理表中5組數(shù)據(jù)。表中記錄非常之多
    { my $pid=fork();
      $oracle_dbh->{InactiveDestroy}=1;
      if ($pid==0)
        {   ##子進程
            $oracle_dbh->{InactiveDestroy}=1;
            my  $sql_child= qq { select * from hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=}.$_;  ###利用account字段按5取余把表中數(shù)據(jù)分為5個進程待處理的數(shù)據(jù)
            print $sql_child."\n";
            my    $sth_child=$oracle_dbh->prepare($sql_child);#SQL語句
            $sth_child->execute();
            my    @alt_cursor=(); ##初始化數(shù)組
            my    $seq_child=0;
            while(@alt_cursor=$sth_child->fetchrow_array)
            {
                    print $$."\n"; ###有數(shù)據(jù)就隨便打出進程編號
            }
            exit(0);
        }
        elsif ($pid==-1) {print ("fork error\n");
            exit(-1);
        }
        else  ###爹進程
            {sleep 8; ##把這個地方去掉,程序立即結(jié)束。保留的話第一個子進程在8秒內(nèi)運行正常,超過8秒后整個程序異常。
             $oracle_dbh->{InactiveDestroy}=1;}
    }

while(waitpid(-1, WNOHANG)!=-1) {
        my $es=`ps -ef|grep owe`;
        print $es."\n";
}
my  $es=`ps -ef|grep owe`;
print $es."\n";





錯誤 信息如下:


child 4895000 is running!
select * from hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=0

打印第一個子進程的編號無數(shù)行
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。
sleep 8后。。。。。。。。。。。。。。。。。。。

child 6267266 is running!
select * from hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=1
DBD::Oracle::st execute failed: ORA-03106: fatal two-task communication protocol error (DBD ERROR: OCIStmtExecute) [for Statement " select * from hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=1"] at owe.pl line 171.
DBD::Oracle::st fetchrow_array failed: ORA-03115: unsupported network datatype or representation (DBD ERROR: OCIStmtFetch) [for Statement " select * from hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=0"] at owe.pl line 174.
DBD::Oracle::st fetchrow_array failed: ERROR no statement executing (perhaps you need to call execute first) [for Statement " select * from hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=1"] at owe.pl line 174.
###################################
###################################
child 3494328 is running!
select * from hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=2
DBD::Oracle::db prepare failed: ORA-03113: end-of-file on communication channel (DBD ERROR: error possibly near <*> indicator at char 15 in ' select * from <*>hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=2') [for Statement " select * from hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=2"] at owe.pl line 170.
Can't call method "execute" on an undefined value at owe.pl line 171.
###################################
child 6324638 is running!
select * from hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=3
DBD::Oracle::db prepare failed: ORA-03135: connection lost contact (DBD ERROR: error possibly near <*> indicator at char 15 in ' select * from <*>hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=3') [for Statement " select * from hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=3"] at owe.pl line 170.
Can't call method "execute" on an undefined value at owe.pl line 171.
###################################
child 6402494 is running!
select * from hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=4
DBD::Oracle::db prepare failed: ORA-03135: connection lost contact (DBD ERROR: error possibly near <*> indicator at char 15 in ' select * from <*>hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=4') [for Statement " select * from hiuinv1o.acc_fund_book
                                 WHERE  MOD(account_id,5)=4"] at owe.pl line 170.
Can't call method "execute" on an undefined value at owe.pl line 171.
###################################
###################################
     wcr  242108 2965682   2 16:13:59 pts/19  0:00 perl owe.pl
     wcr 6402496  242108   0 16:14:36 pts/19  0:00 grep owe

###################################
     wcr  242108 2965682   2 16:13:59 pts/19  0:00 perl owe.pl
     wcr 6324640  242108   0 16:14:36 pts/19  0:00 grep owe

###################################
     wcr  242108 2965682   2 16:13:59 pts/19  0:00 perl owe.pl
     wcr 3494330  242108   0 16:14:36 pts/19  0:00 grep owe

###################################
     wcr  242108 2965682   3 16:13:59 pts/19  0:00 perl owe.pl
     wcr 6267268  242108   0 16:14:37 pts/19  0:00 grep owe

###################################
     wcr  242108 2965682   3 16:13:59 pts/19  0:00 perl owe.pl
     wcr 4895002  242108   0 16:14:37 pts/19  0:00 grep owe

###################################
     wcr  242108 2965682   3 16:13:59 pts/19  0:00 perl owe.pl
     wcr 4895004  242108   0 16:14:37 pts/19  0:00 grep owe

論壇徽章:
0
2 [報告]
發(fā)表于 2010-05-24 18:16 |只看該作者
自頂一下。

論壇徽章:
0
3 [報告]
發(fā)表于 2010-05-25 10:42 |只看該作者
我把操作單獨寫為一個小程序,然后用system狂調(diào)來解決問題,但我真的很想知道原來的程序錯在哪兒。因為用現(xiàn)在的方法寫出來的代碼很丑很別扭。點名蘭花仙子來解決啦。:wink:

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
4 [報告]
發(fā)表于 2010-05-25 12:37 |只看該作者
fork出的進程pid你要保存起來,然后一個個的waitpid.
例如,你把產(chǎn)生的子進程id存在@children中
最后:

  1. foreach my $child (@children) {
  2.      print "waiting $child\n";
  3.      waitpid($child, 0);
  4. }
復制代碼

論壇徽章:
0
5 [報告]
發(fā)表于 2010-05-25 14:53 |只看該作者
{:3_198:}同意PY的,應該是沒有做進程互斥導致的。

論壇徽章:
78
雙子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06獅子座
日期:2013-10-18 13:40:31雙子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年紀念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56處女座
日期:2013-10-24 17:15:30雙子座
日期:2013-10-25 13:49:39午馬
日期:2013-10-28 15:02:15
6 [報告]
發(fā)表于 2010-05-25 16:21 |只看該作者
這個應該不是代碼的問題,ORA-03106:ORA-03115:這些錯誤都是oracle客戶端的版本問題

論壇徽章:
0
7 [報告]
發(fā)表于 2010-05-25 16:44 |只看該作者
回復 6# yybmsrs


    舉個例子:當一個進程正在進行fetchrow_array,數(shù)據(jù)沒取完的時候,另外一個進程用同樣$dbh去執(zhí)行prepare之類的時候,就會出錯。

論壇徽章:
78
雙子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06獅子座
日期:2013-10-18 13:40:31雙子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年紀念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56處女座
日期:2013-10-24 17:15:30雙子座
日期:2013-10-25 13:49:39午馬
日期:2013-10-28 15:02:15
8 [報告]
發(fā)表于 2010-05-25 17:29 |只看該作者
回復 7# toniz


    oracle的沒測,但是我在mysql下測試了10W條數(shù)據(jù)情況,這樣寫是沒問題的。有時間測下oracle的

論壇徽章:
0
9 [報告]
發(fā)表于 2010-05-25 17:33 |只看該作者
仔細看了一下,還有一個原因,就是$dbh會受到exit的影響。任意一個子進程使用exit退出后,$dbh將會失效。

論壇徽章:
0
10 [報告]
發(fā)表于 2010-05-25 17:38 |只看該作者
回復 8# yybmsrs


    如果不互斥,讓幾個進程同時執(zhí)行,有可能報:
DBD::Oracle::db prepare failed: ORA-01002: fetch out of sequence ( 游標錯誤)
   也可能報:
DBD::Oracle::db prepare failed: ORA-03124: two-task internal error

總之我這邊上面兩個錯誤是隨機的。


   使用waitpid之后,就會報:DBD::Oracle::db prepare failed: ORA-03113: end-of-file (這個是受到子進程exit的影響)
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP