Chinaunix
标题:
Linux 下多线程访问informix问题
[打印本页]
作者:
海飏
时间:
2010-05-25 17:09
标题:
Linux 下多线程访问informix问题
大家好,小弟刚接触多线程+数据库编程遇到一个问题向大家请教,希望大家不吝赐教,问题描述如下:
我想要多线程访问informix数据库,但是只使用一个连接,即在主线程里创建一个连接,然后在所有的线程里共享这个连接;
Google,百度我都找过了,其中有一个这样回答如下:
多个线程共享一个连接时,在连接建立好以后,可以在一个线程中使用 EXEC SQL set connection 'con' dormant;
将连接置于dormant状态,此时的连接可以被其它的线程激活。
其它线程使用
do {
EXEC SQL set connection 'con';
} while ( ( sqlca.sqlcode == -1802 ) );
将连接激活,此时可以访问数据库了,而且只用本线程可以访问数据库。
只有本线程将连接置为dormant后,才可以再被其它的线程使用。
这个方法我试过了,但是会报错,具体错误码我给忘记了,现在又连不上服务器了!请大家给指点一下,小弟感激不尽……
作者:
kuok2000
时间:
2010-05-25 19:17
帮顶顺便学习了..
作者:
海飏
时间:
2010-05-26 13:20
问题补充,如果加上 do {
EXEC SQL set connection 'con';
} while ( ( sqlca.sqlcode == -1802 ) );
程序会停滞,(我感觉像是两个线程死锁了)
如果仅仅加EXEC SQL set connection 'con';的话程序会报-1811错误;
请大家帮帮忙了,大恩不言谢
作者:
海飏
时间:
2010-05-29 13:10
问题解决了,我把方法大体说一下吧,希望对大家有所帮助。基本就是使用“EXEC SQL set connection 'con';”方法如下:在主线程中建立连接之后,在建立子线程之前应该调用EXEC SQL set connection 'con' dormant;将连接置为空闲,这样子线程才能够使用这个连接,同样,在子线程建立后应该调用"EXEC SQL set connection 'con';”(以我理解理解这里的意思就是告诉其他线程,我拿到连接了,你们先等会吧),我在三楼说的那个方法基本可以了,不过漏掉了一句(因为这一句我搞了半天!);应该改成
do{
EXEC SQL set connection 'con';
pthread_yield();
}while ( ( sqlca.sqlcode == -1802 ) );
我测试的结果是,如果没有调用pthread_yield();最后一个线程写入时报-1802错误,具体原因还没搞明白,如果有人知道原因的话,非常希望你能告诉我一声;
然后就是最后在子线程退出前调用EXEC SQL set connection 'con' dormant dormant;即将线程置为闲置状态,这样其他线程便可以用该连接了;好了,基本就是这样子,如果有不对的地方欢迎大家指正,谢谢
作者:
海飏
时间:
2010-05-29 13:12
void pthread_fun_share()
{
do{
EXEC SQL set connection 'proxy_test';
pthread_yield();
}while ( ( sqlca.sqlcode == -1802 ) );
static int i=0;
long ret=0,ret1=0;
int ret2=0,ret3=0,count=0;
char temp_id[]="1234321";
char time_tmp[40],time_now[40];
Instruct_Message ins_message = {"2010-05-11 16:29:00.37500","access_user","equiptname","255.255.255.255","8888","9999","portuser","instruction","127.127.127.127","client_meching_name"};
Security_Message sec_message = {"2010-05-18 16:19:41.37500","access_user","equipe_name","255.255.255.255","8888","9999","port_user","instruction","operation","remarkremarkremarkremarkremark","127.127.127.127","client_mechine_name"};
Interact_Message int_message = {1,1,"abcdefghijklmnopqrstuvwxyz"};
printf("第【%d】次创建线程成功:",++i);
getMiTime_back(time_now);
strcpy(ins_message.operation_time,time_now);
strcpy(sec_message.operation_time,time_now);
if(ret1>0)
{
int_message.instruction_log_id=ret1;
}
else
{
printf("获取instruction_log_id失败,ret1=[%d]\n",ret1);
exit(0);
}
ret3=write_security_log(&sec_message);
for(count=1;count<4;count++)//假设每次执行指令都有三次内容返回
{
int_message.content_index=count;
write_interaction_log(&int_message);
}
EXEC SQL set connection 'proxy_test' dormant;
}
作者:
海飏
时间:
2010-05-29 13:15
上面就是子线程里面的操作,我本来想加说明的,不知道怎么回事就给发出去了,反正最主要的就是开始和结束那一部分,其他的地方都是一些数据声明及函数调用,相信大家应该能看明白的
作者:
kuok2000
时间:
2011-01-17 17:59
欧了。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2