|
原帖由 newkid 于 2010-2-23 23:47 发表 ![]()
如果仅仅是数据加载,不涉及任何事务处理逻辑,映射到结构就没什么意义,一个二维数组就够了。你需要的只是一个缓存,从文件读入,再送给目标数据库。
通用的数据抽取转换工具已经很多了,我只要使用就行。
hibernate我们是不用的,看不到任何好处。我们大量使用存储过程。
好吧,给你一个不用DAU的OCI程序的例子,你就知道为什么要用结构映射了:
- #include<ocilib.h>
- #include<sys/time.h>
- long interval(struct timeval *begtime,struct timeval *endtime)
- {
- long ret;
- ret=endtime->tv_sec-begtime->tv_sec;
- ret*=1000000;
- ret += endtime->tv_usec - begtime->tv_usec;
- return ret;
- }
- static OCI_Connection *cn = NULL;
- static int nb_err=0;
- void err_handler(OCI_Error *err)
- {
- if (OCI_ErrorGetType(err) == OCI_ERR_ORACLE)
- {
- const mtext *sql = OCI_GetSql(OCI_ErrorGetStatement(err));
- if (sql != NULL)
- {
- fprintf(stderr,"> ERROR - SQL : %s\n",sql);
- }
- }
- fprintf(stderr,">ERROR %d , MSG: %s\n",
- OCI_ErrorGetOCICode(err),OCI_ErrorGetString(err));
- nb_err++;
- }
- /* ------------------------------------------------------------------------ *
- * disconnect
- * ------------------------------------------------------------------------ */
- void disconnect(OCI_Connection *cn)
- {
- OCI_ConnectionFree(cn);
- }
- void cleanup(void)
- {
- OCI_Cleanup();
- }
- int loadfile(OCI_Connection *cn)
- {
- OCI_Statement *st = NULL;
- OCI_Resultset *rs = NULL;
- int ret,num=0;
- char buf[4096],*p;
- char *tok="|";
- struct timeval begtime,endtime;
- gettimeofday(&begtime,0);
- st = OCI_StatementCreate(cn);
- ret=OCI_Prepare(st, "INSERT INTO TJRB "
- "(tjdate,unit,tabname,flg,"
- "dat1,dat2,dat3,dat4,dat5,dat6,dat7,dat8,dat9,"
- "dat10,dat11,dat12,dat13,dat14,dat15,dat16,dat17,dat18,dat19,"
- "dat20,dat21,dat22,dat23,dat24,dat25,dat26,dat27,dat28,dat29,"
- "dat30,dat31,dat32,dat33,dat34,dat35,dat36,dat37,dat38,dat39,"
- "dat40,dat41,dat42,dat43,dat44,dat45,dat46,dat47,dat48,dat49,"
- "dat50) VALUES (to_date(:tjdate,'YYYY-MM-DD'),:unit,:tabname,:flg,"
- ":dat1,:dat2,:dat3,:dat4,:dat5,:dat6,:dat7,:dat8,:dat9,"
- ":dat10,:dat11,:dat12,:dat13,:dat14,:dat15,:dat16,:dat17,:dat18,:dat19,"
- ":dat20,:dat21,:dat22,:dat23,:dat24,:dat25,:dat26,:dat27,:dat28,:dat29,"
- ":dat30,:dat31,:dat32,:dat33,:dat34,:dat35,:dat36,:dat37,:dat38,:dat39,"
- ":dat40,:dat41,:dat42,:dat43,:dat44,:dat45,:dat46,:dat47,:dat48,:dat49,"
- ":dat50)");
- gettimeofday(&endtime,0);
- fprintf(stderr,"prepare TIMEVAL=%ld\n",interval(&begtime,&endtime));
- if(ret != TRUE) return -1;
- while(!ferror(stdin)) {
- fgets(buf,sizeof(buf),stdin);
- if(feof(stdin)) break;
- p=strtok(buf,tok);
- OCI_BindString(st,MT(":tjdate"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":unit"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":tabname"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":flg"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat1"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat2"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat3"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat4"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat5"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat6"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat7"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat8"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat9"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat10"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat11"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat12"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat13"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat14"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat15"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat16"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat17"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat18"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat19"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat20"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat21"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat22"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat23"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat24"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat25"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat26"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat27"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat28"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat29"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat30"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat31"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat32"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat33"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat34"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat35"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat36"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat37"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat38"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat39"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat40"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat41"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat42"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat43"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat44"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat45"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat46"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat47"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat48"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat49"),p,strlen(p)+1);
- p=strtok(0,tok);
- OCI_BindString(st,MT(":dat50"),p,strlen(p)+1);
- ret= OCI_Execute(st);
- OCI_BindFreeAll(st);
- if(ret==TRUE) num++;
- }
- OCI_StatementFree(st); //关闭游标
- return num;
- }
- main(int argc ,char *argv[])
- {
- int ret;
- OCI_Error *err;
- struct timeval begtime,endtime;
- gettimeofday(&begtime,0);
- if (!OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT))
- return 1;
- cn = OCI_ConnectionCreate("ticket", "ticket", "ticket", OCI_SESSION_DEFAULT);
- gettimeofday(&endtime,0);
- fprintf(stderr,"connect TIMEVAL=%ld\n",interval(&begtime,&endtime));
- if(!cn) {
- fprintf(stderr,"OCI_ConnectionCreate Error\n");
- cleanup();
- return 2;
- }
- ret=loadfile(cn);
- gettimeofday(&begtime,0);
- if(ret<0) OCI_Rollback(cn);
- else OCI_Commit(cn);
- gettimeofday(&endtime,0);
- fprintf(stderr,"loadfile:%d commit TIMEVAL=%ld\n",ret,interval(&begtime,&endtime));
- // disconnect(cn); //关闭一个连接
- cleanup(); //关闭全部包括上一步
- return 0;
- }
复制代码
比起48页478楼的例子,它只能加载我们前边说的tjrb表,还不能处理重码问题。
加载这个表(从空表),DAU的时间是1.1秒,这个程序是2.4秒,区别在于它没有用结构,每次从文件读入的行,每列的位置不固定,因此不能一次绑定,多次使用。
它也是保留游标的,但每次绑定变量,效率。。。。。。。
能不能写一个公用程序把列绑定到离散的变量里?这太难了,即使能够从数据库中分析表结构,你如何自动安排数十个不同类型的离散变量?动用一大堆malloc?如果传给其他函数处理?一大堆数目不定的自变量?怎么释放?因此通过结构映射是最方便的做法。
你也看到DAU的效率远高于直接的OCI,不是DAU高于OCI,而是我DIY的比你DIY高明。
哪个通用,哪个好懂,哪个省事,哪个高效。。。。。。
OCI程序不像存储过程,不能自动绑定变量,绑定的过程相当繁琐,所以如果不用DAU,许多OCI程序员就不玩绑定了。这就是DAU工具的重大意义。
处理业务逻辑,使用列名是不可避免的,但存取数据还要列举列名是多么痛苦的一件事,这个程序已经列举3遍了,还不包括对结构的映射。
hibernate,你不用,用的大有人在,火得很哦。包装简化了使用,即使损失些效率,也受欢迎。
[ 本帖最后由 yulihua49 于 2010-3-1 10:31 编辑 ] |
|