我有一个多线程的Pro * C程序,它在不同的连接和运行时上下文中调用每个线程中的匿名存储过程。
我的匿名过程调用从过程返回需要不同的时间帧,有时甚至无限期挂起。我的Oracle程序返回只需0.05秒,因为它在AWR日志中显示,但令人惊讶的是,Pro * C调用需要5秒钟才能从程序返回。
Pro * C过程调用与实际Oracle过程执行之间涉及的处理活动是什么?有锁或其他阻塞问题吗?
答案 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_kill
或pthread_cancel
向线程发送信号以停止线程。
答案 1 :(得分:0)
您可以尝试Oracle跟踪(DBMS_MONITOR)并查看跟踪文件中的最后一个活动。我能想到的唯一可能是时间问题的是,如果过程返回一个较大的值(BLOB,CLOB,XML),这需要时间通过网络返回客户端(或者客户端在接收数据的大小)。