【问题标题】:Pro*C procedure call hangs indefinitelyPro*C 过程调用无限期挂起
【发布时间】:2011-06-09 12:48:19
【问题描述】:

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

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

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

【问题讨论】:

  • 对于阻塞,看我的回答:stackoverflow.com/questions/6046502/…
  • Mathew,您在此处指定的情况与我目前面临的情况不同,我的实际 oracle 过程调用在 0.3 秒内完成,但我对同一过程的 pro*c 调用大约需要 5 秒返回。
  • 我是 tbone,而不是 Mathew ;-) 我的 (tbone) 答案具有查找阻塞会话信息(如果有)所需的 SQL ...您无限期地提到“挂起”,这听起来像是阻塞问题可能
  • Tbone ,存储过程(SQL)没有问题,但 proc 和 oracle 存储过程之间的接口似乎有问题。想知道从 proc 调用匿名 PL/SQL 语句时究竟会发生什么
  • 每个线程都有自己的连接,还是您要共享?

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


【解决方案1】:

如果它无限期挂起,那么是的,涉及某种类型的阻塞(或轮询等......函数中发生了某些事情导致它不返回)。

根据您在此问题上发布的其他问题,如果您只想杀死已挂起的特定线程,那么您可以查看的是将线程 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 on,否则可以使用pthread_killpthread_cancel 向线程发送信号以停止线程。

【讨论】:

  • jason,感谢您的关注和详细解释,我最担心的是 proc 匿名过程调用没有返回(无限期挂起),而 oracle 中的实际过程已经返回。我试图了解 proc 中的过程调用和 oracle 中的实际过程之间涉及的活动。这样我们就可以在可能的情况下对其进行调整!!!
【解决方案2】:

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

【讨论】:

  • 好的,但是它的多线程客户端,其中大约 200 个线程(客户端)将一次又一次地调用相同的过程,每个线程(客户端)大约 800 个事务。程序不会一直挂起,但会随机挂起并且永远不会返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 2011-05-07
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多