我有一个多线程Pro*C程序,它在单独的连接和运行时上下文中的每个线程中调用匿名存储过程。
我的匿名过程调用需要不同的时间才能从过程中返回,有时甚至会无限期挂起。正如AWR日志中所示,我的Oracle过程只需要0.05秒就可以返回,但令人惊讶的是,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
向线程发送信号以停止线程。
您可以尝试Oracle跟踪(DBMS_MONITOR)并查看跟踪文件中的最后一个活动。我唯一能想到的可能会正确解释时间的事情是,如果过程返回一个大值(BLOB、CLOB、XML),该值需要时间才能通过网络返回给客户端(或者客户端因接收到的数据大小而阻塞)。