免费注册 查看新帖 |

Chinaunix

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

子线程中如何访问主线程中的数据库连接? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-27 10:14 |只看该作者 |倒序浏览
我的应用程序是如下结构:
main.c  程序的逻辑流程
mydb.pc 包含对数据库表访问的函数,所有的SQL语句封装到函数中,便于在main.c中使用。
        例如
        XXX_connect(),XXX_disconnect(),
        XXX_insert_table1(),XXX_insert_table2(),
        XXX_delete_table1(),XXX_delete_table2()等。

main.c中主程序如下:
main()
{
    XXX_connect(...);

    while(1)
    {
        reqid=RecvRequest(...);

        switch(reqid)
        {
          INS_TABLE1_REQ: XXX_insert_table1(...);
                      break;
          INS_TABLE2_REQ: XXX_insert_table2(...);
                      break;
          DEL_TABLE1_REQ: XXX_delete_table1(...);
                      break;
          DEL_TABLE2_REQ: XXX_delete_table2(...);
                      break;
          default:
        }

        SendResponse();
     }
}   

在单进程情况下,程序运行正常。后来需要将上面的程序改为多线程。我在主进程
中调用一次XXX_connect,在子线程中访问数据库,在访问数据库函数的前后我增加
了互斥锁,保证同一时间只有一个线程访问数据库。

但是这又出现一个问题,子线程对数据库的访问报错“未登录”。
这样只有两种方法了:
1,每个子线程都调用一次XXX_connect()、XXX_disconnect(),但是我觉得这样肯定效率很低。
2,查找资料,看到可以用ProC的
   EXEC SQL ENABLE THREADS;
   EXEC SQL CONTEXT ALLOCATE :envtext;
   EXEC SQL CONTEXT USE :envtext;
   我在mydb.pc中将envtext作为全局变量,然后每个函数加一句EXEC SQL CONTEXT USE :envtext;
   仍然报错“未登录”。看到资料上的说法是将envtext作为参数传入每个数据库访问函数,
   即XXX_insert_table1(envtext,...),问题在于XXX_insert_table1()是在main.c中调用,c文件
   中无法定义sql_context类型的变量。资料上proC的多线程作法完全是把业务逻辑写在pc文件中的,
   跟我的应用有所不同,我的应用是把逻辑写在c文件中的。

请问我应该如何实现子线程对数据库的连接呢?
程序与数据库的连接是相当于一个会话吗?子进程无法使用该连接吗?

谢谢。

论坛徽章:
0
2 [报告]
发表于 2004-02-27 13:54 |只看该作者

子线程中如何访问主线程中的数据库连接?

你跟踪一下,子线程访问使用的句柄,是不是就是主线程申请的。应该说,建立连接和使用连接完全可以在不同的线程中。

论坛徽章:
0
3 [报告]
发表于 2004-02-27 14:02 |只看该作者

子线程中如何访问主线程中的数据库连接?

怎么跟踪数据库连接句柄?

论坛徽章:
0
4 [报告]
发表于 2004-02-27 15:59 |只看该作者

子线程中如何访问主线程中的数据库连接?

调试你的程序啊。

论坛徽章:
0
5 [报告]
发表于 2004-02-27 19:25 |只看该作者

子线程中如何访问主线程中的数据库连接?

这是我的connect函数,里面哪个是句柄啊?

int XXX_Connect(char *dbname,char *username,char *pswd)
{
        EXEC SQL BEGIN DECLARE SECTION;
        varchar loginuser[256];
        EXEC SQL END DECLARE SECTION;
       
        EXEC SQL WHENEVER SQLERROR DO log_sql_error("ORACLE ERROR";
        sprintf(loginuser.arr,"%s/%s@%s",username,pswd,dbname);
        loginuser.len=strlen(loginuser.arr);
       
        EXEC SQL CONNECT : loginuser;

        return sqlca.sqlcode;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP