2011-06-09 41 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