我正在调用另一台服务器中的Oracle存储过程。因此,如果存在网络问题,应用程序将“卡在”OCI_Execute(语句)中。
我需要为此SP执行设置超时或者检查连接状态,我不知道通常的方法是什么。
这是我正在做的一个例子:
#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);
}
正如我所说,它位于函数execStoredProc
- OCI_Execute(stmt);
的第一行 - 当网络出现故障时程序卡住了,如何设置限制,例如5秒执行此功能。我只需要提示搜索内容或代码示例,谢谢!
答案 0 :(得分: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;
}