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

时间:2011-06-09 12:48:20

标签: c oracle stored-procedures oracle-pro-c

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

我的匿名过程调用从过程返回需要不同的时间帧,有时甚至无限期挂起。我的Oracle程序返回只需0.05秒,因为它在AWR日志中显示,但令人惊讶的是,Pro * C调用需要5秒钟才能从程序返回。

Pro * C过程调用与实际Oracle过程执行之间涉及的处理活动是什么?有锁或其他阻塞问题吗?

2 个答案:

答案 0 :(得分: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数组,然后查看哪些已完成。 finsihed,您可以调用pthread_join,否则您可以使用pthread_killpthread_cancel向线程发送信号以停止线程。

答案 1 :(得分:0)

您可以尝试Oracle跟踪(DBMS_MONITOR)并查看跟踪文件中的最后一个活动。我能想到的唯一可能是时间问题的是,如果过程返回一个较大的值(BLOB,CLOB,XML),这需要时间通过网络返回客户端(或者客户端在接收数据的大小)。