为啥我的三层服务器!到一个客户端在执行一个大的数据查询时!其它客户端就好像阻塞掉了!一定要等前一个查询完成后才能继续其它数据返回!(100分)

  • 主题发起人 主题发起人 chinanbzxx
  • 开始时间 开始时间
to lich:
你的是正确的,不过不完全正确。
我做过一个简单的测试,服务端写一个方法叫:
function TrdmTest.ServerAddr: WideString;
begin
Result := Integer(Self);
end;
用来返回当前服务端的 RemoteDataModule 的指针
客户端测试代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(AppServer.ServerAddr));
end;

客户端可启动多个测试一下,
当客户用 TSocketConnection 和 TDCOMConnection 连接时,每个
实例返回的服务器模块指针是不一样的,这说明服务器为每个连接单独开了一个实例。
而当客户用 TWebConnection 连接时,情况就变了,每个实例返回的值是一样的!
即用 TWebConnection 时不是多线程模式——郁闷!
 
可能不是楼上的所说的这样,建议你做进一步的测试:
在你的方法中加入延时 Sleep(10000), 延时10秒钟
然后你的三个客户端同时发出请求,再看返回的指针是否一样
 
楼上的说法没有验证吧,
在客户端用 TWebConnection 时,不管延时多久,也不管有几个客户端同时发出请求,
只要 SERVER 还处理激活状态,返回的值一定是一样的.
 
我是没有验证,但是你验证了吗?
下面是我针对TWebConnetion 的测试结果,
在Win2000 Professional 的 IIS ISAPI上进行的测试
使用了系统自带的httpsrvr.dll
我也像你那样返回了对象的地址
服务器端的方法我做了修改,改为:
function TDBSrv.TestStr: WideString;
var
s: String;
begin
s := IntToStr(GetTickCount);
Sleep(3000);
s := s + ',' + IntToStr(GetTickCount);
Sleep(2000);
s := s + ',' + IntToStr(GetTickCount);
Result := s + ' :$' +IntToHex(Integer(Self), 8);
end;

客户端调用的代码是:
procedure TForm1.Button1Click(Sender: TObject);
begin
WebConnection1.Connected := True;
Caption := WebConnection1.AppServer.TestStr;
WebConnection1.Connected := False;
end;

我先后启动了4个客户端,分别调用此函数,
结果如下(数字是自计算机启动以来的毫秒计数):
客户端1: 27498160,27501164,27503167 :$00AB6938
客户端2: 27498560,27501565,27503568 :$00AB7E68
客户端3: 27499001,27502005,27504008 :$00AB69F8
客户端4: 27499552,27502556,27504559 :$00AB93A0
大家看我的测试结果,支持了我的观点,那就是:
Borland 不会犯这么低级的错误
 
即使不同时调用,返回的服务器对象的地址依然不相同,
表示每个客户端都有一个远程数据模块为其服务,
这和 Delphi中的帮助的说明是一致的
 
非常感谢 lich 老兄的测试,
不过我说的也是真的.
我发现是环境问题, 我照你的例子又写了一个测试,
发现在 XP 系统中,如果URL写的是IP地址而不是localhost则得出的结果如我所述.
后来我移到 win2003 server 中又试了一下,结果如你所述.
我想是和 XP 有关吧,不信你可以试一下.
但是还是非常非常感谢你!
[blue][h2]为了表达这份谢意请到我提问的那个主题领分吧![/h2][/blue]
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2271546
 
后退
顶部