用 ScktSrvr时,中间层报告‘超时已过期’,客户端就被挂起,或连接不上,如何解决? 这个问题不定什么时候出现,一旦服务器端,应用层报告‘超时已过期‘的对话框,整个系统全被挂起,在服务器端把对话框点掉,系统又正常了。我用的是ScktSrvr.exe做服务。请大家帮助啦! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 服务器端是不是有动态生成的adoconnection,如果有的话,改成静态的,keepconnection设为true。我以前遇到的超时已过期都是adoconnection连接失败弹出的,如使用静态的,程序一旦连接成功就不会出现这个弹出了。 应该说我还没有用到动态生成的adoconnection,而且keepconnection应该都缺省设为true(待会我全部查一遍,谢谢!),报告‘超时已过期’也是没有什么时间上的规律,有时是一天报告一次,有时三五天也没有报告,因为应用层是dll形式,也无法定位是哪里代码报错的。 但我用了如下的形式,Result:=TADOConnection(Owner.Components[i]);即共享调用以前连接曾经上的TADOConnection,请问 erhan ,不知道也会存在这样的问题? 不出这个错就只能try...except...end了,但是你要知道出错代码的大概位置。Result:=TADOConnection(Owner.Components[i]);,这句话没有影响。 adoconnection连接失败弹出的,是不是就是 ADOConn.Connected := True; 地方会弹出的?我真不知道还会有哪些语句会出现‘超时已过期’的错误提示框,请erhan 再详细说说。这个问题折磨我很长时间,试了很多办法,还是不定期弹出,一弹出,几十个用户同时都被挂住,点掉那个框又全都好了,真要命 超时已过期不光是在adoconn.connedted := True的时候出,adoquery.open,adoquery.execsql等时候都会出,而adoquery.open如果返回一个超大的结果集的时候出现的概率更高。当然网络的稳定也是非常重要的。如果你的确有超大结果集的查询,建议你使用“分页”查询,分成多次。另外,我以前写过一段代码,可以无限等待查询成功,你可以参考一下。procedure TMainForm.QueryExec(mTempQuery:TADOQuery);var mError: boolean;begin while 0=0 do begin mError := False; try mTempQuery.ExecSQL; except mError := True; end; if mError then begin try mTempQuery.Connection.Connected := False; mTempQuery.Connection.Connected := True; except end; Application.ProcessMessages; end else break; end;end;如果有结果集返回,原程序为:adoquery1.open;//adoquery1.open等同于adoquery1.ExecSQL加上adoquery1.Active:=True;改为:ExecQuery(adoquery1);adoquery1.Active := True;如果无结果集返回,原程序为:adoquery1.ExecSQL;改为:ExecQuery(adoquery1);我在很多程序中都使用了这段函数,从未出现过“超时已过期”的提示错误。使用这个函数最好在程序开发完毕后统一替换,因为程序内部处理比较简单,如果adoquery1.sql.text本身就是一个语法错误的sql查询语句,会导致程序进入死循环。 这种情况是对于未抓获的异常..TAPPLICATION对象自己拦截处理弹出的对话框.只需要对Appplycation.OnException事件进行处理.拖一个TApplicationEvents控件是比较方便,然后处理它的OnException事件..在这个事件中可以什么事都不做..不过最好还是在里面把异常信息通过文件日志方式输出.这样既可以看到输出,又不会阻塞服务. 1、首先检查有没有设超时的时间。2、检查数据控件的参数。特别是clientdata的参数。 请问pdbird(老巢),clientdata的参数在哪里?我中间层用了TRemoteDataModule、TAdoDataSet和TDataSetProvider;客户端用了TClientDataSet,都没有clientdata的参数。莫非是TAdoDataSet的CommandTimeOut?确省为30S 另外,我用的是dll,TApplicationEvents放在每个TRemoteDataModule上,一个DLL可能有数个TRemoteDataModule的。我的DLL的.dpr代码如下:library TWDAssign;uses ComServ, W_DMAssign in 'W_DMAssign.pas' {Assign: TRemoteDataModule} {Assign: CoClass}, ..... .....;exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer;{$R *.TLB}{$R *.RES}beginend.不知道在这里怎么写的? 三层dll里TApplicationEvents不知道该放在哪里? 如果是EXE型的,在启动FORM上面用一个TApplicationEvents就行了.如果是DLL型,那放TRemoteDataModule是可以的..因为TRemoteDataModule是远程调用时候才创建,得每个TRemoteDataModule上面放一个,呵呵. 播放器 可拖动的 进度条 如何 实现啊? [请教] 人物在地图上走动 堵塞模式下,如何删除线程呢.. quickreport如何安装,怎样判断是否已经安装好 f1book注册方式(制作安装文件) 如何在线实现声音流的控制 如何控制打印预览(用的是quickreport)中的close 按钮事件?? 感谢axcyy网友的大力支持!动态建立索引的问题解决了,归纳如下。 如何在delphi中动态加载控件?就象vb中一样?举个例子! 如何在系统中注册dat设备???? 关于messagebox 的问题 为什么用下面的方法取不到另一个窗体中的BMP图像?
Result:=TADOConnection(Owner.Components[i]);即共享调用以前连接曾经上的TADOConnection,请问 erhan ,不知道也会存在这样的问题?
Result:=TADOConnection(Owner.Components[i]);,这句话没有影响。
我真不知道还会有哪些语句会出现‘超时已过期’的错误提示框,请erhan 再详细说说。
这个问题折磨我很长时间,试了很多办法,还是不定期弹出,一弹出,几十个用户同时都被挂住,点掉那个框又全都好了,真要命
当然网络的稳定也是非常重要的。如果你的确有超大结果集的查询,建议你使用“分页”查询,分成多次。另外,我以前写过一段代码,可以无限等待查询成功,你可以参考一下。
procedure TMainForm.QueryExec(mTempQuery:TADOQuery);
var
mError: boolean;
begin
while 0=0 do
begin
mError := False;
try
mTempQuery.ExecSQL;
except
mError := True;
end;
if mError then
begin
try
mTempQuery.Connection.Connected := False;
mTempQuery.Connection.Connected := True;
except
end;
Application.ProcessMessages;
end
else
break;
end;
end;如果有结果集返回,原程序为:
adoquery1.open;//adoquery1.open等同于adoquery1.ExecSQL加上adoquery1.Active:=True;
改为:
ExecQuery(adoquery1);
adoquery1.Active := True;如果无结果集返回,原程序为:
adoquery1.ExecSQL;
改为:
ExecQuery(adoquery1);我在很多程序中都使用了这段函数,从未出现过“超时已过期”的提示错误。使用这个函数最好在程序开发完毕后统一替换,因为程序内部处理比较简单,如果adoquery1.sql.text本身就是一个语法错误的sql查询语句,会导致程序进入死循环。
拖一个TApplicationEvents控件是比较方便,然后处理它的OnException事件..在这个事件中可以什么事都不做..不过最好还是在里面把异常信息通过文件日志方式输出.
这样既可以看到输出,又不会阻塞服务.
2、检查数据控件的参数。特别是clientdata的参数。
ComServ,
W_DMAssign in 'W_DMAssign.pas' {Assign: TRemoteDataModule} {Assign: CoClass},
.....
.....;
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;{$R *.TLB}{$R *.RES}begin
end.
不知道在这里怎么写的?
得每个TRemoteDataModule上面放一个,呵呵.