我正在实施以下方案:
产生了100个线程,每个线程都连接到具有单独连接和运行时上下文的DB。每个线程都将执行一个返回ref cursor的存储过程。
问题:有时调用存储过程永远不会返回(proc挂起的存储过程调用)
问题:如果在指定的时间内没有返回存储过程的调用,有没有办法超时?
答案 0 :(得分:1)
为什么不在你的线程中实现一个计时器?如果超时则重新建立数据库连接并重试。
超时的唯一问题是,如果数据库服务器非常繁忙,它可能不会挂起,只是运行速度非常慢。
答案 1 :(得分:0)
在POSIX平台上,如果您正在执行常规阻止系统调用,例如read
,write
,wait
等,您可以使用select
或{{ 1}}监视描述符,以确定数据何时可用于阻止阻塞(带有相关的超时参数),或使用警报触发一个信号,该信号将导致系统调用以poll
错误返回。 / p>
现在,是阻止某些Oracle DB特定呼叫的呼叫还是正常的系统呼叫?如果是前者(即不是系统调用),那么你可以采用另一种方法来获得超时警报,当它关闭时,你会杀死任何仍在运行的线程。使用pthreads,从父线程开始每个子线程作为分离线程,这样当调用成功完成时,它将自行结束,无需手动终止它或调用EINT
。将数组保存到所有pthread ID,当闹钟响起时,只需在主父线程的所有线程描述符上调用pthread_join
。对于已完成的线程,这将不执行任何操作,但对于卡住的线程,它们将被终止。
您可以在生成任何子线程之前通过在主父线程中阻止它来阻止来自所有线程的警报信号,然后使用pthread_cancel
来监视来自父线程的超时警报的到达。这样做可以防止任何子线程捕获警报信号(即只有父线程会捕获并处理警报信号)。
答案 2 :(得分:0)
数据库库可能已经支持超时功能。 Sybase dblib可以。