2011-06-08 71 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可以。