deathbravo 回复于:2003-07-24 12:28:46 |
有没有use context呀?
子线程里是不是默认使用default的context; 另外请告诉我你的程序的访问速度好吗 |
wlkwlk 回复于:2003-07-24 12:38:21 |
我有用 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); } |
wlkwlk 回复于:2003-07-24 12:44:10 |
我采用的是子线程调度 动态库的形式。
数度大概在每分钟 3000-4000笔左右。 |
deathbravo 回复于:2003-07-24 13:07:49 |
EXEC SQL CONTEXT USE :envtext;
应该在connect之前呀; 要不然你连接的就是default; envtext的环境里就是未连接的; |
wlkwlk 回复于:2003-07-24 13:18:29 |
非常感谢,我试了一下,还请问一下,如果在子线程里创建连接,context 变量 envtext 是否必须定义为全局变量。 |
deathbravo 回复于:2003-07-24 13:25:25 |
不必;
但是这个连接只能在子线程内部使用; 子线程结束就释放掉; 可是我觉得这样开销比较大呀; 我是在主线程里建立了一个context池; 可是速度并不比你得快多少;每分钟也就7000到8000比; 最高不超过10000; 你如果发现什么提高速度的窍门,请一定告诉我; |
wlkwlk 回复于:2003-07-24 13:39:18 |
以前我也是采用在主线程建立连接,然后子线程直接共享主线程的连接对DB进行操作,但是如果两个子线程同时对DB进行操作则会 Core 程序崩溃 ,而且我建立的子线程是守候线程,不会退出,所有我需要为每个子线程创建一个context池。速度我也在通过各种方式优化。如有大的提高我会通知您的。 |
wlkwlk 回复于:2003-07-24 14:03:30 |
/* 此函数在子线程中被调用 */
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 不能连接数据库,麻烦请看一看。谢谢!! |
deathbravo 回复于:2003-07-24 14:09:56 |
调用contest 时需要把envtext作为参数传给它;
然后在contest 内部所有SQL语句前面加上 EXEC SQL CONTEXT USE :xxxxxxx; 不然contest 内部的嵌入SQL会使用default context; |
jsean 回复于:2003-07-24 21:46:23 |
问一下,这是pro*c编程吗? |
蓝色键盘 回复于:2003-07-25 09:56:13 |
嗯,不错,偶觉得论坛中讨论的气氛现在很好。
楼上两位讨论的很好! |
wlkwlk 回复于:2003-07-25 11:27:46 |
[quote:70dc671568="jsean"]问一下,这是pro*c编程吗?[/quote:70dc671568]
是的。 |
wlkwlk 回复于:2003-07-25 11:30:53 |
deathbravo 您好,我的问题已经解决,我用的是ORACLE默认的连接池。再次感谢你的帮助。
现在我在测试性能,如果有比较大的提高我会通知的。 |
deathbravo 回复于:2003-07-25 11:39:47 |
共同进步,静候佳音 |
xasun 回复于:2003-07-28 15:19:07 |
能否告诉我你的proc程序的运行环境? |
bjf 回复于:2003-11-28 10:13:07 |
如果一个进程创建了一个以上的线程,这些线程都要独占一个连接,并行地去访问数据库,这样做还行吗?我也正在为此事烦恼呢。 |
lihuabo 回复于:2004-05-17 13:43:55 |
我的问题更加郁闷.(导师要我解决的)我用一个线程建立连接后,循环访问数据库,如果在此时网线断掉,那么线程将会阻塞,怎么也动不了.应该怎么解决?? |