当前位置: 技术问答>linux和unix
proc多线程程序中的问题,望高手帮助
来源: 互联网 发布时间:2015-11-28
本文导语: 我有个c的proc多线程程序,在oracle 9i上编译执行都没有什么问题,可到oracle 8i上就编译后却无法正常执行了 我测了一下 如果把dbConnect->execUpdataSql(delSql);放到main中执行是没有问题的,就是在放到SyncThread类中执行m_dbCo...
我有个c的proc多线程程序,在oracle 9i上编译执行都没有什么问题,可到oracle 8i上就编译后却无法正常执行了
我测了一下
如果把dbConnect->execUpdataSql(delSql);放到main中执行是没有问题的,就是在放到SyncThread类中执行m_dbConnect->execUpdataSql(delSql);就不行,该函数它会运行到“EXEC SQL IMMEDIATE :delSql”语句时会不经过希构函数就直接退出该类,也就是说该语句无法顺利执行,而且还不报错
备注:
1)m_dbConnect-是在new SyncThread()的时候用dbConnect传进来的
2)我是用AT :dbName的方式实现多线程
我知道这个是为什么,我到底忽略了什么,proc 8.1.6.0.0和proc9.2.0.5.0到底有什么区别呢,在做多线程时proc 8.1需要增加一些什么才能实现?望各位帮帮忙
我测了一下
如果把dbConnect->execUpdataSql(delSql);放到main中执行是没有问题的,就是在放到SyncThread类中执行m_dbConnect->execUpdataSql(delSql);就不行,该函数它会运行到“EXEC SQL IMMEDIATE :delSql”语句时会不经过希构函数就直接退出该类,也就是说该语句无法顺利执行,而且还不报错
备注:
1)m_dbConnect-是在new SyncThread()的时候用dbConnect传进来的
2)我是用AT :dbName的方式实现多线程
我知道这个是为什么,我到底忽略了什么,proc 8.1.6.0.0和proc9.2.0.5.0到底有什么区别呢,在做多线程时proc 8.1需要增加一些什么才能实现?望各位帮帮忙
|
多线程中,必须使用上下文进行控制。
short ConnectDBMS(char *outStr, DB_SESSION *DBSession,
char *user, char *password, char *server)
{
char userPass[50];
char dbstr[50];
sprintf(userPass, "%s/%s", user, password);
sprintf(dbstr, "%s", server);
EXEC SQL WHENEVER SQLERROR GOTO ERR_RETURN;
EXEC SQL CONTEXT ALLOCATE :DBSession->ctx;
EXEC SQL CONTEXT USE :DBSession->ctx;
EXEC SQL CONNECT :userPass USING :dbstr;
return DB_SUCCESS;
ERR_RETURN:
{
err_report(outStr, sqlca);
return DB_FAILURE;
}
}
void DisconnectDBMS(DB_SESSION *DBSession)
{
char outStr[400];
ExecuteSql(outStr, DBSession, "rollback");
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL CONTEXT USE :DBSession->ctx;
EXEC SQL ROLLBACK WORK RELEASE;
EXEC SQL CONTEXT FREE :DBSession->ctx;
}
short ConnectDBMS(char *outStr, DB_SESSION *DBSession,
char *user, char *password, char *server)
{
char userPass[50];
char dbstr[50];
sprintf(userPass, "%s/%s", user, password);
sprintf(dbstr, "%s", server);
EXEC SQL WHENEVER SQLERROR GOTO ERR_RETURN;
EXEC SQL CONTEXT ALLOCATE :DBSession->ctx;
EXEC SQL CONTEXT USE :DBSession->ctx;
EXEC SQL CONNECT :userPass USING :dbstr;
return DB_SUCCESS;
ERR_RETURN:
{
err_report(outStr, sqlca);
return DB_FAILURE;
}
}
void DisconnectDBMS(DB_SESSION *DBSession)
{
char outStr[400];
ExecuteSql(outStr, DBSession, "rollback");
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL CONTEXT USE :DBSession->ctx;
EXEC SQL ROLLBACK WORK RELEASE;
EXEC SQL CONTEXT FREE :DBSession->ctx;
}
|
C的多线程控制稳定性差而且复杂,建议你学学Fortran语言
|
我这个程序在进程中没有使用关联文本,可它在oracle 9i上的proc中程序是可以正常执行的,到了8i才不行,所以我想应该不仅仅只有上下关联文本可以使用在proc多进程编程中。
故而我现在想能否有一个方案可以在8i中起到9i这样的功能
-------------------------------------------------------------
我在oracle9i和oracle8i用多线程开发过,都必须使用上下文才行,否则会出现异常退出,dump。
故而我现在想能否有一个方案可以在8i中起到9i这样的功能
-------------------------------------------------------------
我在oracle9i和oracle8i用多线程开发过,都必须使用上下文才行,否则会出现异常退出,dump。