原帖由 asword 于 2008-11-21 17:18 发表 ![]()
建议楼主好好测试并发>100,及读写单表40个字段以上,数百万条记录的History表性能如何,
虽然我C语言远远比不上楼主,可是总有些担心这样做的性能
另外挑一个小刺,
SELECT c.table_name,c.column_name,decode(data_type, 'CHAR',1, 'VARCHAR',1, 'VARCHAR2',1, 'DATE',129,'FLOAT',8, 'LONG',126, 'NUMBER',decode(nvl(DATA_SCALE,0),0, decode(nvl(data_precision,0), 0,257, 1,2, 2,2, 3,3, 4,4, 5,4, 6,4, 7,4, 8,4,9,4, 10,6, 11,6, 12,6, 13,6, 14,6, 15,6, 16,6, 17,6, 18,6, 257),8),257) Fld_Column_Type,decode(data_type, 'CHAR',data_length+1, 'VARCHAR',data_length+1,'VARCHAR2',data_length+1, 'DATE',20,'FLOAT',8,'LONG',-1, 'NUMBER', decode(nvl(DATA_SCALE,0),0,decode(nvl(data_precision,0), 0,35, 1,1, 2,1, 3,2, 4,4, 5,4, 6,4, 7,4, 8,4, 9,4, 10,8, 11,8, 12,8, 13,8, 14,8, 15,8, 16,8, 17,8, 18,8, 257),8),35) Fld_Column_Len,decode(data_type, 'CHAR',null, 'VARCHAR',null, 'VARCHAR2',null, 'DATE','YYYY-MM-DD HH24:MI:SS','FLOAT','%%lg','LONG',null, 'NUMBER',decode(nvl(DATA_SCALE,0),0,null,'%%'||to_char(data_precision+2)||'.'||to_char(DATA_SCALE)||'lf'),null) Fld_Format,k.position
FROM all_tab_columns c, (select table_name,column_name,position from all_cons_columns where owner='TICKET' and table_name='SEAT' and position is not null) k
where c.table_name = k.table_name(+) and c.column_name = k.column_name(+) and c.owner = 'TICKET' and c.table_name='SEAT' order by c.table_name, c.column_id
all_tab_columns 是oracle独有的视图,你这样做,如果数据库端换sqlserver,
这段模板代码得重写吧,实际上没有达到你老板要求的中间层可以使用任意数据库。
放心吧,我们将来的表有上亿记录,数万终端争夺。没问题的,效率要比JDBC高。
现在的测试表有百万记录。当然没做那么多终端。不过当年的SRM系统,经过数百终端的考验,所以有把握。
DTO的底层是SDBC(安全数据库连接),诞生13年了,以安全、高效为宗旨,开发过很多项目,以快著称。
DTO没干什么,来回拷贝数据而已(数据传送对象),就是生成SQL,不过sprintf而已,没什么效率问题,
前边说了,每秒6万条的Fetch能力,包括DTO。
给你看看 DTO_next:
int DTO_next(DTO *DP)
{
int ret;
if(!DP||!DP->srm.rec||!DP->srm.tp) return -1;
if(DP->cursor<0) {
if(!DP->srm.rp || !*DP->srm.rp) return -1;
DP->srm.rp += net_dispack(DP->srm.rec,DP->srm.rp,DP->srm.tp);
return 0;
}
// DP是prepare的
ret=___SQL_Fetch__(DP->SQL_Connect,DP->cursor,DP->srm.result);
if(ret){
sprintf(DP->srm.result,"DTO_next:err=%d,%s",
DP->SQL_Connect->Errno,
DP->SQL_Connect->ErrMsg);
return ret;
}
net_dispack(DP->srm.rec,DP->srm.result,DP->srm.tp);
return 0;
}
什么都没干,哪来效率问题?
[ 本帖最后由 yulihua49 于 2008-11-21 18:01 编辑 ] |