我采取了以下方案:如何超时如果PROC存储过程不返回
100个线程启动,并每个线程连接与分离连接DB和运行时环境。每个线程将执行一个存储过程,该过程返回引用游标。
问题:有时打电话给存储过程不会返回(从PROC挂起存储过程调用)
问:有什么办法超时从PROC存储过程的调用,如果它不指定返回时间?
我采取了以下方案:如何超时如果PROC存储过程不返回
100个线程启动,并每个线程连接与分离连接DB和运行时环境。每个线程将执行一个存储过程,该过程返回引用游标。
问题:有时打电话给存储过程不会返回(从PROC挂起存储过程调用)
问:有什么办法超时从PROC存储过程的调用,如果它不指定返回时间?
为什么不在你的线程中实现一个定时器?如果超时,请重新建立数据库连接并重试。
超时的唯一问题是如果数据库服务器非常繁忙,它可能不会挂起,只是运行速度非常慢。
在一个POSIX平台,如果你正在做一个正常封闭的系统调用诸如read
,write
,wait
等既可以使用select
或poll
监视当数据可用时,以防止阻塞描述符(具有相关联的超时参数),或者使用警报触发一个信号,该信号将导致系统调用以EINT
错误返回。
现在,是阻止某些Oracle数据库特定调用,或只是正常的系统调用?如果前者(即不是系统调用),那么你可以采取另一种方法,当你有一个超时警报时,当它关闭时,你杀掉所有仍在运行的线程。使用pthreads,将父线程中的每个子线程作为分离线程启动,以便在呼叫成功完成时,它将自行结束,而无需手动终止它或致电pthread_join
。将数组保存到所有的pthread ID中,当闹钟响起时,只需在主父线程的所有线程描述符上调用pthread_cancel
即可。对于已完成的线程,这将不会执行任何操作,但对于被卡住的线程,它们将被终止。
在产生任何子线程之前,您可以通过在主父线程中阻止来自所有线程的警报信号,然后仅使用sigwait
来监视父线程的超时警报到达。这样做会阻止任何子线程捕捉到警报信号(即,只有父级会捕获和处理警报信号)。
数据库库可能已经支持超时功能。 Sybase dblib可以。
感谢您的宝贵答案, – Sal 2011-06-09 12:52:56