|
原帖由 stillwalking 于 2009-1-12 12:36 发表 ![]()
dblink这个东东不好说,是挺方便,但是,如果我有几千万数据要快速处理完,dblink肯定不如proc同时建立多个长连接快。
dblink是什么?不懂,需要学习。
最近没闲着,程序已经包装到DAU里了,程序员可以透明的使用bind了。只是,如果数据有问题,看不出来,给调试造成一定麻烦。
见一个申请席位的事务记录:
2 SP0102002:21778 01/16 10:51'36 getctx:1232074293 called!
5 SP0102002:21778 01/16 10:51'36 bind_update:bind=19,sth=0,stmt=UPDATE TICKET.TUXCONTEX SET(clid,devid,userid,username,stat_date,shift_code,devtype,unit,perm,purpose1,purpose2,purpose3,purpose4,purpose5,purpose6,purpose7,purpose8,last_oper)=(SELECT :1, :2, :3, :4,to_date(:5,'YYYY-MM-DD'), :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17,to_date(:18,'YYYY-MM-DD HH24:MI:SS') FROM DUAL) where clid=:19,
2 SP0102002:21778 01/16 10:51'36 seatapply:2009-01-17|H6|BHHP|SJHP|20|0|10|
5 SP0102002:21778 01/16 10:51'36 to getxw:2009-01-16|H6B|BHHP|6|20|0|10|
5 SP0102002:21778 01/16 10:51'36 bind_prepare:cursor=0,SELECT /* +rule */ to_char(start_date,'YYYY-MM-DD') start_date,beg_station,train_no,run_train,to_char(on_date,'YYYY-MM-DD HH24:MI') on_date,carno,seat_type,seat_no,end_station,shortest_station,purpose,gride,pro,flag,used_dev,used_uid,to_char(used_time,'YYYY-MM-DD HH24:MI:SS') used_time,ROWID FROM TICKET.SEAT WHERE start_date=to_date(:1,'YYYY-MM-DD') AND beg_station=:2 AND train_no=:3 AND SEAT_TYPE > :4 AND (SEAT_TYPE <= :5+9) AND end_station>=:6 AND purpose=:7 AND FLAG=0 AND ROWNUM <= :8 ORDER BY END_STATION,CARNO,SEAT_NO,SEAT_TYPE FOR UPDATE WAIT 10 SKIP LOCKED
5 SP0102002:21778 01/16 10:51'36 seat_DAO AU_prepare ret=0,err=0,
5 SP0102002:21778 01/16 10:51'36 bind_update:bind=5,sth=1,stmt=UPDATE TICKET.SEAT SET(flag,used_dev,used_uid,used_time)=(SELECT :1, :2, :3,to_date(:4,'YYYY-MM-DD HH24:MI:SS') FROM DUAL) WHERE ROWID=:5 ,
2 SP0102002:21778 01/16 10:51'36 seatapply:成功申请票 10 !
DAO如下:
int getSeat_for_sell(DAU *DP,int quantity,char *stmt)
{
int ret;
char tmp[1024],*p;
char xb;
p=(char *)DAU_getP_by_key(DP,"ROWID" ; //借用,bind变量
sprintf(p,"%d",quantity);
xb=*(char *)DAU_getP_by_key(DP,"seat_type" ;
p=stmt;
p=mk_where1(DP,"start_date",p);
p+=sprintf(p," AND beg_station=:beg_station AND train_no=:train_no AND " ;
if(xb%10) {
p+=sprintf(p,"SEAT_TYPE=:seat_type " ;
} else {
p+=sprintf(p,"SEAT_TYPE > :seat_type AND (SEAT_TYPE <= :seat_type+9) AND " ;
}
p+=sprintf(p,"end_station>=:end_station AND purpose= urpose AND FLAG=0 AND ROWNUM <= :ROWID "
"ORDER BY END_STATION,CARNO,SEAT_NO" ;
if(!(xb%10)) {
p+=sprintf(p, ",SEAT_TYPE" ;
if(xb==0) p+=sprintf(p," DESC " ;//无号优先给硬座
}
p+=sprintf(p," FOR UPDATE WAIT 10 SKIP LOCKED" ;
DP->srm.selectExtra="/* +rule */";
ret=DAU_prepare(DP,stmt);
if(ret) {
ShowLog(1,"seat_DAO AU_prepare ret=%d,err=%d,%s",ret,
DP->SQL_Connect->Errno,
DP->SQL_Connect->ErrMsg);
}
return ret;
}
可以看出,用户使用:名 进行bind,DAU内部进行了一个变换成数字。
进行了100个进程的并行测试,运行时间基本是线性的。
既然DAU系统性能已经接近系统极限,提供了近乎线性的并行负载,那么,在大多数情况下,调用存储过程是不必要的。毕竟,存储过程对C结构的映射很困难。
在本坛看到大量高深的问题和神秘莫测的sql语句。这些问题对于我们而言,其实很简单,用简单的sql存取数据,用C语言处理复杂逻辑,一切都不是问题。
[ 本帖最后由 yulihua49 于 2009-1-16 17:10 编辑 ] |
|