2011-06-08 72 views
1

我采取了以下方案:如何超时如果PROC存储过程不返回

100个线程启动,并每个线程连接与分离连接DB和运行时环境。每个线程将执行一个存储过程,该过程返回引用游标。

问题:有时打电话给存储过程不会返回(从PROC挂起存储过程调用)

问:有什么办法超时从PROC存储过程的调用,如果它不指定返回时间?

回答

1

为什么不在你的线程中实现一个定时器?如果超时,请重新建立数据库连接并重试。

超时的唯一问题是如果数据库服务器非常繁忙,它可能不会挂起,只是运行速度非常慢。

0

在一个POSIX平台,如果你正在做一个正常封闭的系统调用诸如readwritewait等既可以使用selectpoll监视当数据可用时,以防止阻塞描述符(具有相关联的超时参数),或者使用警报触发一个信号,该信号将导致系统调用以EINT错误返回。

现在,是阻止某些Oracle数据库特定调用,或只是正常的系统调用?如果前者(即不是系统调用),那么你可以采取另一种方法,当你有一个超时警报时,当它关闭时,你杀掉所有仍在运行的线程。使用pthreads,将父线程中的每个子线程作为分离线程启动,以便在呼叫成功完成时,它将自行结束,而无需手动终止它或致电pthread_join。将数组保存到所有的pthread ID中,当闹钟响起时,只需在主父线程的所有线程描述符上调用pthread_cancel即可。对于已完成的线程,这将不会执行任何操作,但对于被卡住的线程,它们将被终止。

在产生任何子线程之前,您可以通过在主父线程中阻止来自所有线程的警报信号,然后仅使用sigwait来监视父线程的超时警报到达。这样做会阻止任何子线程捕捉到警报信号(即,只有父级会捕获和处理警报信号)。

+0

感谢您的宝贵答案, – Sal 2011-06-09 12:52:56

0

数据库库可能已经支持超时功能。 Sybase dblib可以。