Pro*C过程调用无限期挂起

Pro*C过程调用无限期挂起,c,oracle,stored-procedures,oracle-pro-c,C,Oracle,Stored Procedures,Oracle Pro C,我有一个多线程Pro*C程序,它在单独的连接和运行时上下文中调用每个线程中的匿名存储过程 我的匿名过程调用从过程返回需要不同的时间框架,有时甚至会无限期挂起。正如AWR日志所示,我的Oracle过程只需0.05秒即可返回,但令人惊讶的是,Pro*C调用从过程返回需要5秒 Pro*C过程调用和实际Oracle过程执行之间涉及的处理活动是什么?是否存在任何锁或其他阻塞问题?如果它无限期地挂起,则是的,存在某种类型的阻塞(或轮询等…。函数中发生了某种情况,导致它无法返回) 从你们在这件事上发布的另一个

我有一个多线程Pro*C程序,它在单独的连接和运行时上下文中调用每个线程中的匿名存储过程

我的匿名过程调用从过程返回需要不同的时间框架,有时甚至会无限期挂起。正如AWR日志所示,我的Oracle过程只需0.05秒即可返回,但令人惊讶的是,Pro*C调用从过程返回需要5秒


Pro*C过程调用和实际Oracle过程执行之间涉及的处理活动是什么?是否存在任何锁或其他阻塞问题?

如果它无限期地挂起,则是的,存在某种类型的阻塞(或轮询等…。函数中发生了某种情况,导致它无法返回)

从你们在这件事上发布的另一个问题来看,若你们想杀死一个已经挂起的特定线程,那个么你们可以考虑的一件事是将你们的线程ID设置为一个有“finished”标志的结构

#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;
}
#包括
#包括
结构线程id
{
pthread\u t线程;
sig_原子线程标志;
};
无效初始线程id(结构线程id*id)
{
id->thread\u标志=0;
}
线程id线程[线程数];
void*thread_函数(void*arg)
{
线程id*我的线程id=(线程id*)参数;
//在你的思路里做点什么
//完成后,设置该线程的标志
我的线程标识->线程标记=1;
}

现在,当您设置超时警报时,只需在
线程id
数组中滚动,查看哪些超时警报已完成。找到的线程,可以调用
pthread\u join
on,否则可以使用
pthread\u kill
pthread\u cancel
向线程发送信号以停止线程

您可以尝试Oracle跟踪(DBMS_监视器),并查看跟踪文件中的最后一个活动。我能想到的唯一一件事是,如果过程返回一个大值(BLOB、CLOB、XML),它需要时间通过网络返回到客户端(或者客户端因接收数据的大小而阻塞)。

有关阻塞,请参阅我的答案:Mathew,您在此处指定的情况与我目前面临的情况不同,我实际的oracle过程调用将在0.3秒内完成,但我对同一过程的pro*c调用需要大约5秒才能返回。我是tbone,不是Mathew;-)我的(tbone)答案包含查找阻塞会话信息(如果有)所需的SQL…您提到了无限期“挂起”,这听起来像是阻塞问题,这不是存储过程(SQL)的问题,而是proc和oracle存储过程之间的接口问题。想知道从proc调用匿名PL/SQL语句时会发生什么情况每个线程都有自己的连接,还是您正在尝试共享?jason,感谢您的关注和详细解释,我最担心的是proc匿名过程调用没有返回(挂起不确定)而oracle中的实际过程已返回。我试图理解proc中的过程调用和oracle中的实际过程之间所涉及的活动。这样我们可以调整它,如果可能的话!!!好的,但是它的多线程客户端,其中大约200个线程(客户端)将一次又一次地调用相同的过程,每个线程(客户端)大约有800个事务。过程不会总是挂起,但有时它会随机挂起,并且永远不会返回。