2016-06-17 4 views
0

私は別のサーバにあるOracleストアドプロシージャを呼び出しています。そのため、ネットワークに問題がある場合、アプリケーションはOCI_Execute(文)に「スタックします」。C - ストアドプロシージャコール(ocilib)のタイムアウトを設定する

このSP実行にタイムアウトを設定する必要がありますか、または接続状態を確認する必要がありますが、私はいつものアプローチがわかりません。どのように、ネットワークに障害が発生したときに、プログラムが立ち往生することができます - OCI_Execute(stmt); - 私はそれが機能execStoredProcの1行目にあります、言ったように

#include <stdio.h> 
#include <ocilib.h> 

OCI_Connection *dbConn; 
OCI_Statement *storedProcStmt; 
otext *storedProcQuery = "BEGIN TEST_PROC (:param1,:param2,:result); END;"; 

int main() 
{ 
    if(connectDB() != 0){ 
     return (1); 
    } 

    storedProcStmt = OCI_StatementCreate(dbConn); 
    OCI_Prepare(storedProcStmt, storedProcQuery); 

    char paramResult[3] = ""; 
    OCI_BindString(storedProcStmt, ":param1", "123", strlen("123")); 
    OCI_BindString(storedProcStmt, ":param2", "abc", strlen("abc")); 
    OCI_BindString(storedProcStmt, ":result", paramResult, 2); 

    execStoredProc(storedProcStmt); 

    printf("RESULT:\n"); 
    printf("%s\n", paramResult); 

    return (0); 
} 

int connectDB() 
{ 
    if (!OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT)) 
     return (EXIT_FAILURE); 

    dbConn = OCI_ConnectionCreate("xe", "user", "password", OCI_SESSION_DEFAULT); 

    if (dbConn == NULL) 
    { 
     printf("Could not connect to DB\n"); 
     return (1); 
    } 

    printf("Connected to DB\n"); 

    return (0); 
} 

int execStoredProc(OCI_Statement *stmt) 
{ 
    OCI_Execute(stmt); 
    OCI_Commit(dbConn); 
    OCI_StatementFree(stmt); 
} 

を:ここで

は私がやっているものの一例ですこの関数を実行するには、例えば5秒という制限を設定します。私は何を検索するか、またはコード例のヒントが必要です、ありがとう!

答えて

0

私はちょうど検索するかのヒントやコード例が必要

#include <setjmp.h> 
#include <signal.h> 
#include <unistd.h> 
jmp_buf env; 
void handler(int signum) { longjmp(env, 1); } 

int execStoredProc(OCI_Statement *stmt) 
{ 
    int err = 1; 
    if (!setjmp(env)) 
    { 
     signal(SIGALRM, handler); 
     alarm(5); 
     OCI_Execute(stmt); 
     alarm(0); 
     err = 0; 
     OCI_Commit(dbConn); 
    } 
    OCI_StatementFree(stmt); 
    return err; 
} 
関連する問題