免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3270 | 回复: 6
打印 上一主题 下一主题

Linux 下多线程访问informix问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-25 17:09 |只看该作者 |倒序浏览
大家好,小弟刚接触多线程+数据库编程遇到一个问题向大家请教,希望大家不吝赐教,问题描述如下:

我想要多线程访问informix数据库,但是只使用一个连接,即在主线程里创建一个连接,然后在所有的线程里共享这个连接;
Google,百度我都找过了,其中有一个这样回答如下:
    多个线程共享一个连接时,在连接建立好以后,可以在一个线程中使用    EXEC SQL set connection 'con' dormant;
      将连接置于dormant状态,此时的连接可以被其它的线程激活。

    其它线程使用
    do {
     EXEC SQL set connection 'con';
    } while ( ( sqlca.sqlcode == -1802 ) );
    将连接激活,此时可以访问数据库了,而且只用本线程可以访问数据库。
    只有本线程将连接置为dormant后,才可以再被其它的线程使用。
这个方法我试过了,但是会报错,具体错误码我给忘记了,现在又连不上服务器了!请大家给指点一下,小弟感激不尽……

论坛徽章:
0
2 [报告]
发表于 2010-05-25 19:17 |只看该作者
帮顶顺便学习了..

论坛徽章:
0
3 [报告]
发表于 2010-05-26 13:20 |只看该作者
问题补充,如果加上 do {
     EXEC SQL set connection 'con';
    } while ( ( sqlca.sqlcode == -1802 ) );
程序会停滞,(我感觉像是两个线程死锁了)
如果仅仅加EXEC SQL set connection 'con';的话程序会报-1811错误;
请大家帮帮忙了,大恩不言谢

论坛徽章:
0
4 [报告]
发表于 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;即将线程置为闲置状态,这样其他线程便可以用该连接了;好了,基本就是这样子,如果有不对的地方欢迎大家指正,谢谢

论坛徽章:
0
5 [报告]
发表于 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;
}

论坛徽章:
0
6 [报告]
发表于 2010-05-29 13:15 |只看该作者
上面就是子线程里面的操作,我本来想加说明的,不知道怎么回事就给发出去了,反正最主要的就是开始和结束那一部分,其他的地方都是一些数据声明及函数调用,相信大家应该能看明白的

论坛徽章:
0
7 [报告]
发表于 2011-01-17 17:59 |只看该作者
欧了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP