我有一个多线程的Pro * C程序,它在每个线程中在不同的连接和运行时上下文中调用匿名存储过程。Pro * C过程调用无限期挂起
我的匿名过程调用需要不同的时间范围才能从过程返回,有时它甚至会无限期地挂起。我的Oracle过程只需要0.05秒即可返回,因为它在AWR日志中显示,但令人惊讶的是,Pro * C调用需要5秒才能从过程返回。
Pro * C过程调用和实际Oracle过程执行之间涉及的处理活动是什么?是否有任何锁定或其他阻塞问题?
我有一个多线程的Pro * C程序,它在每个线程中在不同的连接和运行时上下文中调用匿名存储过程。Pro * C过程调用无限期挂起
我的匿名过程调用需要不同的时间范围才能从过程返回,有时它甚至会无限期地挂起。我的Oracle过程只需要0.05秒即可返回,因为它在AWR日志中显示,但令人惊讶的是,Pro * C调用需要5秒才能从过程返回。
Pro * C过程调用和实际Oracle过程执行之间涉及的处理活动是什么?是否有任何锁定或其他阻塞问题?
如果它无限期悬挂,那么是的,有一些类型的阻塞(或轮询,等等......发生在函数中,导致它不返回)。
从你在这个问题上发布的其他问题来看,如果你想杀死一个已经挂起的特定线程,那么你可以看看的东西就是将你的线程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_kill
或pthread_cancel
来停止线程。
jason,谢谢您的关注和详细解释,我最大的担心是pro * c匿名程序调用在oracle中的实际程序返回时并未返回(挂起不定)。我想了解pro * c中的过程调用和oracle中的实际过程之间涉及的活动。所以我们可以调整它,如果可能的话! – Sal 2011-06-09 15:41:08
您可以尝试使用Oracle跟踪(DBMS_MONITOR)并查看跟踪文件中的最后一个活动。我能想到的唯一一件事情可能会适当地考虑时间,如果过程返回一个较大的值(BLOB,CLOB,XML),这会花费时间通过网络返回客户端(或客户端在接收数据的大小)。
好的,但它的多线程客户端,其中大约200个线程(客户端)将一次又一次地调用相同的过程,每个线程(客户端)大约800个事务。程序不会总是挂起,但有些随机时间会挂起,永远不会返回。 – Sal 2011-06-11 13:43:26
对于阻塞,请参阅我的答案:http://stackoverflow.com/questions/6046502/oracle-materialized-view-alter-structure-so-slow – tbone 2011-06-09 12:58:58
马修,你在这里指定的情况是不同于我目前面对面,我的实际oracle过程调用在0.3秒内完成,但我的pro * c调用相同的过程大约需要5秒才能返回。 – Sal 2011-06-09 15:53:03
我是tbone,而不是Mathew ;-)我的(tbone)答案有找到阻塞会话信息所需的SQL(如果有的话)......你提到无限期地“悬挂”,这听起来像是阻塞问题 – tbone 2011-06-09 16:13:35