1

次のシナリオを実装しています。

100 個のスレッドが生成され、各スレッドは個別の接続とランタイム コンテキストで DB に接続しています。各スレッドは、参照カーソルを返すストアド プロシージャを実行します。

問題: ストアド プロシージャの呼び出しが返されない場合がある (proc からのストアド プロシージャの呼び出しがハングする)

質問: 指定された時間内に戻らない場合、proc からのストアド プロシージャへの呼び出しをタイムアウトにする方法はありますか?

4

3 に答える 3

1

スレッドにタイマーを実装してみませんか?タイムアウトした場合は、データベース接続を再確立して再試行してください。

タイムアウトの唯一の問題は、データベースサーバーが非常にビジー状態の場合、ハングせず、実行速度が非常に遅いことです。

于 2011-06-08T14:08:04.293 に答える
0

POSIXプラットフォームでは、、、などの通常のブロッキングシステムコールを実行している場合、readブロッキングを防ぐために(関連するタイムアウトパラメータを使用して)データが利用可能になるタイミングについて記述子を使用または監視するか、アラームは、syscallがエラーで戻る原因となるシグナルをトリガーします。writewaitselectpollEINT

さて、一部のOracle DB固有の呼び出しをブロックしている呼び出しですか、それとも通常のsyscallですか。前者(つまり、システムコールではない)の場合は、タイムアウトアラームが発生する別のアプローチを取ることができます。タイムアウトアラームが鳴ると、まだ実行中のスレッドをすべて強制終了します。pthreadを使用して、親スレッドから各子スレッドを切り離されたスレッドとして開始します。これにより、呼び出しが正常に完了すると、手動で強制終了したり呼び出したりしなくても、自動的に終了しますpthread_join。すべてのpthreadIDの配列を保持し、アラームが鳴ったらpthread_cancel、メインの親スレッドからすべてのスレッド記述子を呼び出すだけです。完了したスレッドの場合、これは何もしませんが、スタックしているスレッドの場合、それらは強制終了されます。

子スレッドを生成する前にメインの親スレッドでブロックすることにより、すべてのスレッドからのアラームシグナルをブロックし、sigwait親スレッドからのタイムアウトアラームの到着を監視するために使用できます。これを行うと、子スレッドがアラームシグナルをキャッチするのを防ぐことができます(つまり、親だけがアラームシグナルをキャッチして処理します)。

于 2011-06-08T14:08:37.907 に答える
0

データベース ライブラリは、タイムアウト機能を既にサポートしている場合があります。Sybase dblib が行います。

于 2011-06-08T20:30:20.920 に答える