2011-06-09 66 views
0

我有一個多線程的Pro * C程序,它在每個線程中在不同的連接和運行時上下文中調用匿名存儲過程。Pro * C過程調用無限期掛起

我的匿名過程調用需要不同的時間範圍才能從過程返回,有時它甚至會無限期地掛起。我的Oracle過程只需要0.05秒即可返回,因爲它在AWR日誌中顯示,但令人驚訝的是,Pro * C調用需要5秒才能從過程返回。

Pro * C過程調用和實際Oracle過程執行之間涉及的處理活動是什麼?是否有任何鎖定或其他阻塞問題?

+0

對於阻塞,請參閱我的答案:http://stackoverflow.com/questions/6046502/oracle-materialized-view-alter-structure-so-slow – tbone 2011-06-09 12:58:58

+0

馬修,你在這裏指定的情況是不同於我目前面對面,我的實際oracle過程調用在0.3秒內完成,但我的pro * c調用相同的過程大約需要5秒才能返回。 – Sal 2011-06-09 15:53:03

+0

我是tbone,而不是Mathew ;-)我的(tbone)答案有找到阻塞會話信息所需的SQL(如果有的話)......你提到無限期地「懸掛」,這聽起來像是阻塞問題 – tbone 2011-06-09 16:13:35

回答

0

如果它無限期懸掛,那麼是的,有一些類型的阻塞(或輪詢,等等......發生在函數中,導致它不返回)。

從你在這個問題上發佈的其他問題來看,如果你想殺死一個已經掛起的特定線程,那麼你可以看看的東西就是將你的線程ID設置爲一個具有「已完成」標誌的結構在裏面。

#include <pthread.h> 
#include <signal.h> 

struct thread_id 
{ 
    pthread_t thread; 
    sig_atomic_t thread_flag; 
}; 

void init_thread_id(struct thread_id* id) 
{ 
    id->thread_flag = 0; 
} 

thread_id threads[NUMBER_OF_THREADS]; 

void* thread_function(void* arg) 
{ 
    thread_id* my_id = (thread_id*)arg; 

    //do something in your thread 

    //when you finish, set the flag for that thread 
    my_id->thread_flag = 1; 
} 

現在,當您設置超時報警,只需通過的thread_id陣列滾動,看看哪些是完成了。那些被封鎖的,你可以打pthread_join,否則你可以發送信號給線程使用pthread_killpthread_cancel來停止線程。

+0

jason,謝謝您的關注和詳細解釋,我最大的擔心是pro * c匿名程序調用在oracle中的實際程序返回時並未返回(掛起不定)。我想了解pro * c中的過程調用和oracle中的實際過程之間涉及的活動。所以我們可以調整它,如果可能的話! – Sal 2011-06-09 15:41:08

0

您可以嘗試使用Oracle跟蹤(DBMS_MONITOR)並查看跟蹤文件中的最後一個活動。我能想到的唯一一件事情可能會適當地考慮時間,如果過程返回一個較大的值(BLOB,CLOB,XML),這會花費時間通過網絡返回客戶端(或客戶端在接收數據的大小)。

+0

好的,但它的多線程客戶端,其中大約200個線程(客戶端)將一次又一次地調用相同的過程,每個線程(客戶端)大約800個事務。程序不會總是掛起,但有些隨機時間會掛起,永遠不會返回。 – Sal 2011-06-11 13:43:26