0

個別の接続とランタイム コンテキストで各スレッドの匿名ストアド プロシージャを呼び出すマルチスレッド Pro*C プログラムがあります。

匿名のプロシージャ コールは、プロシージャから戻るまでにさまざまな時間枠がかかり、場合によっては無期限にハングすることさえあります。私の Oracle プロシージャは、AWR ログに示されているように、戻るのにわずか 0.05 秒しかかかりませんが、驚くべきことに、Pro*C 呼び出しはプロシージャから戻るのに 5 秒かかります。

Pro*C プロシージャの呼び出しと実際の Oracle プロシージャの実行の間に含まれる処理アクティビティは何ですか? ロックまたはその他のブロックの問題はありますか?

4

2 に答える 2

0

Oracleトレース(DBMS_MONITOR)を試して、トレースファイルの最後のアクティビティを確認できます。私が考えることができる唯一のことは、プロシージャが大きな値(BLOB、CLOB、XML)を返し、ネットワーク経由でクライアントに戻るのに時間がかかる場合(またはクライアントがチョークする場合)です。受信データのサイズ)。

于 2011-06-09T23:05:29.140 に答える
0

それが無期限にぶら下がっている場合は、はい、何らかの種類のブロッキングが関係しています(またはポーリングなど...関数で何かが発生して戻ってこない)。

この問題について投稿した他の質問から、ハングした特定のスレッドを強制終了したい場合は、スレッドIDを「終了」フラグを持つ構造体として設定することができます。

#include <pthread.h>
#include <signal.h>

struct thread_id
{
    pthread_t thread;
    sig_atomic_t thread_flag;
};

void init_thread_id(struct thread_id* id)
{
    id->thread_flag = 0;
}

thread_id threads[NUMBER_OF_THREADS];

void* thread_function(void* arg)
{
    thread_id* my_id = (thread_id*)arg;

    //do something in your thread

    //when you finish, set the flag for that thread
    my_id->thread_flag = 1;
}

タイムアウトアラームを設定したら、の配列をスクロールして、thread_idどれが終了したかを確認します。終了したものは、呼び出すことができます。それ以外の場合は、スレッドを使用して、またはスレッドを停止するためpthread_joinに、スレッドにシグナルを送信できます。pthread_killpthread_cancel

于 2011-06-09T13:06:50.953 に答える