delphi的CGI高手请进,问一个关于CGI耗费时间的瓶颈问题,100分奉上(100分)

  • 主题发起人 主题发起人 panduola
  • 开始时间 开始时间
P

panduola

Unregistered / Unconfirmed
GUEST, unregistred user!
我的CGI程序很慢主要是TPageProducer耗费的时间,贴出部分代码,请问这段代码耗费时间
的瓶颈在什么地方!
if Request.ContentFields.Values['a1']<>'' then
CpNo := Request.ContentFields.Values['a1']
else begin
CpNo := Request.ContentFields.Values['T1']; //彩票号码
Name := Request.ContentFields.Values['T2'];
ManId := Request.ContentFields.Values['T3'];
CpNo := Enc_Dec.StrEnc(CpNo);
end;
SQLStr := 'select tzjh,qh,wf,zzs,tzsj,tzfs,lsh from tz where cph='''+ CpNo+'''';
ADOQ.Close;
ADOQ.SQL.Clear;
ADOQ.SQL.Add(SQLStr) ;
try
ADOQ.Open;
qh := ADOQ.FieldByName('qh').AsString;
wf := ADOQ.FieldByName('wf').AsString;
tzjh := ADOQ.FieldByName('tzjh').AsString;
zzs := IntToStr(ADOQ.FieldByName('zzs').AsInteger);
tzsj := DateTimeToStr(ADOQ.FieldByName('tzsj').AsDateTime);
tzfs := ADOQ.FieldByName('tzfs').AsString;
lsh := ADOQ.FieldByName('lsh').AsString;
except
on E:Exception do
begin
Response.Content := '查询失败,错误原因:' +E.Message ;
exit;
end;
end;

case StrToInt(tzfs) of
1:begin
tzfsch := '单式';
tzfsb := '机选';
end ;
2:begin
tzfsch := '单式';
tzfsb := '自选';
end ;
3:begin
tzfsch := '复式';
tzfsb := '自选';
end ;
4:begin
tzfsch := '复式';
tzfsb := '机选';
end ;
5:begin
tzfsch := '胆拖';
tzfsb := '自选';
end ;
end;
//替换玩法,期号
if TagString='wf' then
ReplaceText := wf
else if TagString='xsqh' then
ReplaceText :=qh
else if TagString='yxqh' then
ReplaceText := qh
//替换投注时间
else if TagString='xssj' then
ReplaceText := tzsj
//替换逻辑机号
else if TagString='ljjh' then
ReplaceText := tzjh
//替换销售流水号
else if TagString='xslsh' then
ReplaceText := lsh
//替代总投注
else if TagString='zzs' then
ReplaceText := zzs
//替换兑奖流水号
else if TagString='djlsh' then
ReplaceText := '0'
//替换销售类型和投注方式
else if TagString='xslx' then
ReplaceText := tzfsch
else if TagString='tzfs' then
ReplaceText := tzfsb;

SQLStr := 'select wf from qcs where qh='''+qh+'''';
ADOQ.Close;
ADOQ.SQL.Clear;
ADOQ.SQL.Add(SQLStr) ;
try
ADOQ.Open
except
on E:Exception do
begin
Response.Content := '查询失败,错误原因:' +E.Message ;
exit;
end;
end;
if ADOQ.FieldByName('wf').AsString='0730' then
Tablenm := 'zj0730'
else if ADOQ.FieldByName('wf').AsString='0523' then
Tablenm := 'zj0523'
else if ADOQ.FieldByName('wf').AsString='0736' then
Tablenm := 'zj0736';
SQLStr := 'select djsj,jzsj,sfdj,djqh from '+Tablenm+' where cph=''' +CpNo+''' and qh='''+qh+'''';
ADOQ.Close;
ADOQ.SQL.Clear;
ADOQ.SQL.Add(SQLStr) ;
try
ADOQ.Open
except
on E:Exception do
begin
Response.Content := '查询失败,错误原因:' +E.Message ;
exit;
end;
end ;
djsj := DateTimeToStr(ADOQ.FieldByName('djsj').AsDateTime);
jzsj := DateTimeToStr(ADOQ.FieldByName('jzsj').AsDateTime);
sfdj := ADOQ.FieldByName('sfdj').AsString;
djqh := ADOQ.FieldByName('djqh').AsString;
if sfdj='False' then
sfdjch := '未兑奖'
else sfdjch := '已兑奖';

SQLStr := 'select sfzh,djr from '+Tablenm+' where cph='''+ CpNo +'''' ;
ADOQ.Close;
ADOQ.SQL.Clear;
ADOQ.SQL.Add(SQLStr) ;
ADOQ.Open ;
ManId := ADOQ.FieldByName('sfzh').AsString;
Name := ADOQ.FieldByName('djr').AsString;

//替换身份证号码
if TagString='sfzh' then
ReplaceText := ManId
//替换中奖人姓名
else if TagString='zjrxm' then
ReplaceText := Name
//替换兑奖日期
else if TagString='djrq' then
ReplaceText := djsj
//替换兑奖期限
else if TagString='djqx' then
ReplaceText := jzsj
//替换兑奖期号
else if TagString='djqh' then
ReplaceText := djqh
//替换兑奖标志
else if TagString='djbz' then
ReplaceText := sfdjch;
 
大哥,你对Delphi开发CGI也感兴趣呀!
MSN:feifan731@hotmail.com
共同探讨一下吧!
嘿嘿!!
 
当然可以探讨,但是现在必须完成问题!大富翁论坛就没有高手吗!斑竹,我很失望呀
问题回答与否在其次,连一个敢发言的都没有!
 
用 ISAPI 要好一些
 
转成isapi类型的应用程序!
用CGI,一个用户请求就启动一次,加上数据库的连接当然耗时了,独立进程呀
 

CGI和WinCGI程序的缺陷是:每次客户的请求都回导致程序的一个实例被启动。
因此如果有很多客户请求,可能使web服务器非常忙碌,因为web服务器要不停的
创建文件、启动进程、执行进程、写文件和返回信息等。
 
bottleneck在ADO连接上。如果死活不用isapi,非得用cgi,想法开一个连接ADO的pool,
象是N-tier里的中间层那样,能好一点。

to 仁我行_zq, CGI不生成文件,WINCGI才那样。
 
尽量少在PageProducer的事件中访问数据库,因为替换时每次if TagString=…… then
ReplaceText……就会触发一次事件,替换的多了比如你这个或许有4,5十次访问
数据库的次数是巨大的,TPageProducer的事件中只管替换不要查询,保你速度有质的提高
 
多人接受答案了。
 
后退
顶部