三层程序,socket连接,客户端不定时死机(100分)

  • 主题发起人 主题发起人 admintty
  • 开始时间 开始时间
A

admintty

Unregistered / Unconfirmed
GUEST, unregistred user!
服务器:win2000srv,delphi7,mysql3.23
中间层:dbexpress+socketsrvt
客户端:win98
编制了一个多层程序,用于考试系统。在客户端加了一个定时器,定期从数据库中读取
一条记录中的一个标志字段,并将当前考试剩余时间传输到数据库中。
问题:在少数客户机(小于20台)的时候,程序基本上可以正常执行。当台数多的时候,
就有不定的几台1、无法执行查询标志,程序停止响应;2、交卷的时候,要定时从
服务程序上读一个数值,结果出现socketsrvt。exe程序返回的读错误。
我在程序中增加了记录语句,将程序出错后的错误信息及一些其他信息记录了下来,结果
发现,如果出现第一中故障,根本没有错误记录,直接死调(使用了try except)。
第二中可以记录下错误信息。
另:1、sockectsrvt。exe程序在超线程计算机上出现问题的补丁我已使用
2、mysql对同一台计算机有最大连接数的限制(缺省100),已修改为3000
3、在中间层程序上 ,已将sqlconnection的KeepConnection改为false
4、数据库和中间层在同一台计算机上
5、考试客户端和中间层在同一个百兆局域网上,网络没有任何问题
6、出现故障的计算机位置是随机的、时间也是随机的
 
可能与超时设置有关吧...
 
socketsrvt.exe为缺省设置,没有设置超时
 
procedure TEduClient.Timer1Timer(Sender: TObject);
const
refeshtime=30;
//刷新间隔时间(秒)
begin
Try
dec(ShengYuShiJianS);
{$IFDEF debug}
if TimeErrLogCount>=MaxTimeErrLogCount then
DaJuan.ResetExam;
//重新连接
{$ENDIF}
if ShengYuShiJianS MOD (refeshtime) =0 then
//经过刷新时间时 剩余时间减刷新时间
begin
{$IFDEF debug}
DaJuan.SaveErrorMsg('刷新剩余时间:'+IntToStr(ShengYuShiJianS)+';准备刷新xykaoshi');
{$ENDIF}
Try
RunQuery(DM.cdsQuery,'select ks_flags from xykaoshi where xy_id='''+Xy_id+''' and ks_zhunkaozheng='''+Xy_pass+'''');
//refresh;
////学员正在答题吗???答题不涉及到考试表 ??? 出现无法捕获错误???????!!!
{$IFDEF debug}
DaJuan.SaveErrorMsg('获取xykaoshi考试标志ks_flags成功');
{$ENDIF}
except
{On E:Exceptiondo
begin
}
Inc(TimeErrLogCount);
DaJuan.SaveErrorMsg('获取xykaoshi考试标志ks_flags出现错误:'+IntToStr(TimeErrLogCount));
//+E.Message
{end;
}
end;
if DM.cdsQuery.FieldByName('ks_flags').AsInteger>0 then
//因各种原因,禁止考试,提交当前做的题目
begin
FinishDaJuan(true);
DaJuan.Close;
SetItemAfterExam(true);
exit;
end;
if ShengYuShiJianS MOD (60) =0 then
//整分时提交剩余时间,减少网络流量
With DM.cdsXYKaoShido
begin
Edit;
FieldByName('ks_shengyusj').AsInteger:=Round(ShengYuShiJianS/60);
//更新剩余时间
Post;
Try
if ApplyUpdates(-1)>0 then
//将时间数据提交
begin
CancelUpdates;//放弃提交
DaJuan.SaveErrorMsg('无法提交XYKaoShi剩余时间,放弃更新');
if ChangeCount>0 then
DaJuan.SaveErrorMsg('无法放弃XYKaoShi剩余时间更新!!!!!!!');
end;
except//若时间数据更新出现问题,忽略
On E:Exceptiondo
begin
DaJuan.SaveErrorMsg('提交XYKaoShi剩余时间出现错误:'+E.Message);
Inc(TimeErrLogCount);
end;
//刷新时间出现错误,不需立即更正。
end;
//try
end;
//if ..with

if ShengYuShiJianS<=0 then
//考试时间用完了吗?
begin
FinishDaJuan(true);//考试结束时间已到,强制交卷
DaJuan.Close;
SetItemAfterExam(true);
exit;
end;
end;
ShowLeftTime;
except
{$IFDEF debug}
On E:exceptiondo
DaJuan.SaveErrorMsg('刷新剩余时间xykaoshi最终错误:'+E.Message);
{$ENDIF}
end;
end;
 
后退
顶部