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

  • 主题发起人 主题发起人 chinanbzxx
  • 开始时间 开始时间
去zhtx说的那个ASTA主页上http://www.astatech.com/products/asta3/下载
然后把ADO换成ASTA试试效果怎么样?看结果再决定研不研究他的源代码
记得告诉大家
还有,我看了他的例子,好像也看不出什么阿,是不是要研究他的VCL源代码?
 
TRemoteDataModule上的TDatabase的HandleShared必须为False,同时
在TRemoteDataModule上放一个TSession控件,AutoSessionName为True,TDatabase的SessionName
属性设为TSession的SessionName属性。
试试看。
关键是理解好HandleShared属性的确实含义。
 
to szf 兄弟你到底有没有试验过!好像不行吧!!!!
 
你有没有搞错呀,如果你用
initialization
TComponentFactory.Create(ComServer, TXXX,
Class_XXX, ciMultiInstance, tmApartment);//XXX是Remoterdatamodule的名字
这样的方式建立远程数据模块,肯定就跟我说的一样。
 
是阿,搂主,我查过了,你只要按照szf的配置再加上 ciMultiInstance, tmApartment
肯定是多线程的,绝对不会一个用户阻塞另一个用户的查询,除非你的程序问题
 
to szf,shiningplus 两位大哥!我不是说他们不是多线程!我承认他这样做是多线程!
可是你们知道吗?实际上这样做的话,线程之间到最后还是排队执行的!我用的BDE连接!
不信你们试一下。如果你们试出来相互不影响的话,I服了YOU!
 
TDatabase的HandleShared如果是True的话,就肯定是排队的。
要多线程查询,必须用TSession组件管理BDE会话。
这个技术已经有定论了,不用试,生产环境中已经是正在使用的了。
 
to szf TDatabase的HandleShared我是False呀大哥
 
补充一下,关于
TComponentFactory.Create(ComServer, TXXX, Class_XXX, ciMultiInstance, tmApartment);
的说明:
tmApartment模式--也就是STA模式,如果你在这种模式下操作了界面元素,则所有的操作将要
进行排队,因此我怀疑你就是因为为了显示操作的过程,所以把STA模式变成了排队操作。
如果数据模块结构和代码都非常简单,改成tmFree。
 
大量的查询尽量使用存储过程,
不要传递SQL语句去执行,效率很低的。
 
to szf,你的MSN?????,我的MSN :NBZXX@CNNB.NET 问你问题
 
我也有这个问题,但是这个应该和bde和ado无关吧。李维取的一个例子就仅仅是延迟显示
字符串,不是也有这个问题,关键解决办法他也没仔细说,要我们动脑筋,可我并不聪明
啊。
所以我是想问:是不是 他指 多建几个远程dm,使它能够为不同sql语句服务,可是总觉得
不对,所以特想问如何在一个com里面 建几个相同的apartment
 
to:szf
我按你的说法做为什么客户端执行变的很慢,
 
我教你一种很好的方法,你在服务器里运行两个中间层,再用负载平衡处理,当第一个中间层忙时,其它的客户端可以运行第二个中间层,那么速度就不会变慢,除非你的数据库服务器本身就很忙。
 
to Nicrosun
我只用一个客户端时都很慢这是怎么回事
 
在做c/s架构时,多线程查询如果是BDE,一定要一个线程一个TSession,
如果是ADO,则一个线程一个TADOConnection,三层我想也一样,如果你一个Session,
当然最终也就一次执行一个sql语句,排队!尽管它是多线程
 
我的数据库是ORCLE,中间层也是TComponentFactory.Create(ComServer, TXXX, Class_XXX, ciMultiInstance, tmApartment);,当有10个以下CLIENT连接的时候没有问题,但多于10个就把中间层搞死了,怎么回事
 
确实如chinanbzxx所说存在排队现象,我用Ado做的中间层,
客户端专门做了一个测试程序,执行多个实例,都定时在同一个时间打开一个中间层的表,
返回所有数据,结果发现需要的最大时间与执行的实例数成正比,
很显然所有中间层是排队执行客户端请求的。
中间层用的是创建时默认的Multi Instance Apartment:
TComponentFactory.Create(ComServer, TTest,
Class_Test, ciMultiInstance, tmApartment);
有没有解决方法?
 
我用 ciMultiInstance, tmApartment 模式测试了一下,测试方法和结果如下:
实现应用服务器,定义方法 TestStr
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;
end;

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

我先后启动了4个客户端,分别调用此函数,
结果如下(数字是自计算机启动以来的毫秒计数):
客户端1: 2556816,2559820,2561823
客户端2: 2557297,2560301,2562304
客户端3: 2557968,2560972,2562975
客户端4: 2558408,2561413,2563415
我们看到上面的时间点发生了严重的重叠,
所以得出结论:
ciMultiInstance, tmApartment 模式并不是排队处理的
而是同时为每个客户端服务的,
这种模式完全可以满足你的需要,
你所说的问题不是数据模块的线程模式造成的,
而是你的别的方面的设计有问题,
才造成了排队的现象(有可能是假排队现象)

 
to xiaasp,
我不管李维先生是怎么讲的,你对于我的测试结果如何看呢?
(4个客户端先后启动,如果是排队的,那么他们的时间点不会重叠,
但实际上重叠的很厉害,说明服务器端有4个线程在同时运行)
显然和你说的是不一致的,这是实际测试的结果,是最权威的!
 
后退
顶部