免费注册 查看新帖 |

Chinaunix

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

UNIX下的线程与ORACLE数据库的连接问题,在线等待!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-07-24 11:25 |只看该作者 |倒序浏览
我用UNIX下的多线程访问ORACLE数据库,出现了一些问题请大家帮忙。
在主线程中创建数据库连接,子线程可以共享此连接对数据库进行访问。
但是我想让数据库连接在子线程中创建,通过日志查看 connect 已经成功,
但是 select 一个表中的数据则报告错误代码为 1012的信息(数据库没有连接的错误)。请问各位谁能帮忙解决此问题,谢谢!!

论坛徽章:
0
2 [报告]
发表于 2003-07-24 12:28 |只看该作者

UNIX下的线程与ORACLE数据库的连接问题,在线等待!!

有没有use context呀?
子线程里是不是默认使用default的context;
另外请告诉我你的程序的访问速度好吗

论坛徽章:
0
3 [报告]
发表于 2003-07-24 12:38 |只看该作者

UNIX下的线程与ORACLE数据库的连接问题,在线等待!!

我有用 context 但是不行,我是在UNIXWARE 上编译的,我将代码贴上,请帮忙看一看,怎样才能实现。谢谢。。。
#include        <string.h>;
#include        <pthread.h>;
#include        <stdio.h>;
#include        <unistd.h>;
#include        <stdlib.h>;
#include        <errno.h>;
#include        <sys/errno.h>;
#include        <math.h>;
#include        <time.h>;
#include        <varargs.h>;
#include        <sys/time.h>;
#include        <sqlda.h>;
#include        <sqlcpr.h>;
#include        <sqlca.h>;
#include        <oraca.h>;


EXEC SQL BEGIN DECLARE SECTION;
        sql_context     envtext;
EXEC SQL END DECLARE SECTION;

/* 连接ORACLE数据库*/
int connectoracle()
{
EXEC SQL BEGIN DECLARE SECTION;
        char    userid[40];
        char    passid[40];
        int        intfilename=0;
EXEC SQL END DECLARE SECTION;

        strcpy(userid , "datalook";
        strcpy(passid , "datalook";

        EXEC SQL CONNECT :userid IDENTIFIED BY :passid;
        EXEC SQL CONTEXT ALLOCATE :envtext;
        EXEC SQL CONTEXT USE :envtext;

        if(sqlca.sqlcode!=0)
        {
                printf("连接失败 sqlcode=[%d]\n",sqlca.sqlcode);
                return(-1);
        }
        printf("Oracle Connect Sucess!!!\n";
        EXEC SQL SELECT FILENAME
                INTO :intfilename FROM SYS_TMP;
        printf("sqlca.sqlcode        =[%d]\n",sqlca.sqlcode);
        printf("intfilename        =[%d]\n",intfilename);
return(0);
}
void FreeConText()
{
        EXEC SQL CONTEXT FREE :envtext;
}
/* Set specify thread stack size */
int SetThreadStackSize(pthread_attr_t *Attr_t,int stacksize)
{
        pthread_attr_t  thread_attr;
        size_t  stack_size;
        int     retcode=0;

        retcode=pthread_attr_init(&thread_attr);
        if(retcode)
        {
                printf("pthread_attr_init\n";
                return(retcode);
        }
        retcode=pthread_attr_getstacksize(&thread_attr,&stack_size);
        if(retcode)
        {
                printf("pthread_attr_getstacksize\n";
                return(retcode);
        }
        retcode=pthread_attr_setstacksize(&thread_attr,stack_size*100);
        if(retcode)
        {
                printf("pthread_attr_setstacksize\n";
                return(retcode);
        }
        memcpy((char *)Attr_t,(char *)&thread_attr,sizeof(pthread_attr_t));
return(0);
}
void *firstthread(void *param)
{
        int        retcode=0;
        pthread_t        conid;
        int        memlen=0;
        pthread_attr_t  attr_val;

        retcode= connectoracle();
        FreeConText();
        printf("firstthread is over..!!!\n";
return(0);
}

int main()
{
        int        retcode=0;
        pthread_t        conid;
        int        memlen=0;
        pthread_attr_t  attr_val;

        memlen=100*16000;
        SetThreadStackSize(&attr_val,memlen);
        retcode=pthread_create(&conid,&attr_val,firstthread,(void *)NULL);
        if(retcode)
        {
                printf("create  ConSumeThread is error [%d]\n",retcode);
                perror("error";
                return(-1);
        }

        retcode=pthread_join(conid,NULL);
        if(retcode)
        {
                printf("pthread_join is error [%d]\n",retcode);
                perror("error";
                return(-1);
        }
        printf("主线程退出!!!\n";
return(0);
}

论坛徽章:
0
4 [报告]
发表于 2003-07-24 12:44 |只看该作者

UNIX下的线程与ORACLE数据库的连接问题,在线等待!!

我采用的是子线程调度 动态库的形式。
数度大概在每分钟 3000-4000笔左右。

论坛徽章:
0
5 [报告]
发表于 2003-07-24 13:07 |只看该作者

UNIX下的线程与ORACLE数据库的连接问题,在线等待!!

EXEC SQL CONTEXT USE :envtext;
应该在connect之前呀;
要不然你连接的就是default;
envtext的环境里就是未连接的;

论坛徽章:
0
6 [报告]
发表于 2003-07-24 13:18 |只看该作者

UNIX下的线程与ORACLE数据库的连接问题,在线等待!!

非常感谢,我试了一下,还请问一下,如果在子线程里创建连接,context 变量 envtext 是否必须定义为全局变量。

论坛徽章:
0
7 [报告]
发表于 2003-07-24 13:25 |只看该作者

UNIX下的线程与ORACLE数据库的连接问题,在线等待!!

不必;
但是这个连接只能在子线程内部使用;
子线程结束就释放掉;

可是我觉得这样开销比较大呀;
我是在主线程里建立了一个context池;
可是速度并不比你得快多少;每分钟也就7000到8000比;
最高不超过10000;
你如果发现什么提高速度的窍门,请一定告诉我;

论坛徽章:
0
8 [报告]
发表于 2003-07-24 13:39 |只看该作者

UNIX下的线程与ORACLE数据库的连接问题,在线等待!!

以前我也是采用在主线程建立连接,然后子线程直接共享主线程的连接对DB进行操作,但是如果两个子线程同时对DB进行操作则会 Core 程序崩溃 ,而且我建立的子线程是守候线程,不会退出,所有我需要为每个子线程创建一个context池。速度我也在通过各种方式优化。如有大的提高我会通知您的。

论坛徽章:
0
9 [报告]
发表于 2003-07-24 14:03 |只看该作者

UNIX下的线程与ORACLE数据库的连接问题,在线等待!!

/* 此函数在子线程中被调用 */
int contest()
{
EXEC SQL BEGIN DECLARE SECTION;
int     intfilename=0;
EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT FILENAME INTO :intfilename FROM SYS_TMP;
printf("in contest sqlca.sqlcode=[%d]\n",sqlca.sqlcode);
printf("in contest intfilename  =[%d]\n",intfilename);
return(0);
/* 子线程 */
void *firstthread(void *param)
{
EXEC SQL BEGIN DECLARE SECTION;
char    userid[40];
char    passid[40];
char    currdate[40];
int     intfilename=0;
sql_context     envtext;
EXEC SQL END DECLARE SECTION;

        strcpy(userid , "datalook";
        strcpy(passid , "datalook";

        EXEC SQL CONTEXT ALLOCATE :envtext;
        EXEC SQL CONTEXT USE :envtext;
        EXEC SQL CONNECT :userid IDENTIFIED BY :passid;
        if(sqlca.sqlcode!=0)
        {
                printf("连接失败 sqlcode=[%d]\n",sqlca.sqlcode);
                return;
        }
        printf("Oracle Connect Sucess!!!\n";
        EXEC SQL SELECT FILENAME INTO :intfilename FROM SYS_TMP;
        printf("sqlca.sqlcode   =[%d]\n",sqlca.sqlcode);
        printf("intfilename     =[%d]\n",intfilename);
        EXEC SQL SELECT TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS') INTO :currdate
                FROM SYS_TMP;
        currdate[14]=0;

        contest();
        printf("contest is over...........\n";

        EXEC SQL CONTEXT FREE :envtext;
return(0);
}
此代码执行以后报告 函数contest 不能连接数据库,麻烦请看一看。谢谢!!

论坛徽章:
0
10 [报告]
发表于 2003-07-24 14:09 |只看该作者

UNIX下的线程与ORACLE数据库的连接问题,在线等待!!

调用contest 时需要把envtext作为参数传给它;
然后在contest 内部所有SQL语句前面加上
EXEC SQL CONTEXT USE xxxxxx;

不然contest 内部的嵌入SQL会使用default context;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP