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

  • 主题发起人 主题发起人 qdyoung
  • 开始时间 开始时间
请教各位:
RDM是多线程的,如果在RDM中如果有一事件A,事件A调用主窗体函数AddLog(sMsg:string)向主窗体中一Memo插入字符串!
请问,在RDM中怎样用Synchronize进行同步???
 
用SocketConnection如何
 
to ZZHI,:
定义一全局的 StringList 对象,访问时用 TCriticalSection 进行保护
在RDM的事件中将字符串写入 StringList对象,注意写入的时候用 TCriticalSection
保护 StringList
然后,发送一个Windows 消息到主窗体
PostMessage(YourMainForm.Handle, WM_USER+5, 0, 0);
主窗口收到消息后,读取StringList对象,将数据写入窗体的Memo
然后清除它,
做这些事情是需要用 TCriticalSection 保护全局变量
 
to lich
谢谢,这个方法我正用着!
我是想有没有用Synchronize同调,稍微简单一点的方法!
 
也就是说,如果还是对主窗体的进行一些其他操作的话,那不到处是代码保护,全局变量保护的代码,这里要注意,那里要注意的!~
 
你的ado控件是怎样创建的?
1、放在datamodule上?
2、程序运行时生成?
这个和并发操作有很大关系
 
数据库连接组件放在com里面
整个服务器只有一个数据库连接必然会排队
 
我的数据库连接组件是放在com里面的,在一般的查询和处理处理过程中是没有什么问题的
但在进行一些大的统计查询中,对各个客户端的影响是非常大的。
对于多线程我是测试过的,和lich的结果一样,但问题还是存在,原因我认为是:
1、sleep()使该线程停止,系统的调度程序会把CUP时间分配给其它线程,所以线程处理是同步的。
2、对于进行数据库的查询、处理等操作情况就很不一样的。数据库接收到一个很大的查询请求后会用掉很多CPU时间而且如果结果集很大,线程在传输数据时也会用掉很多CPU时间,这样分配给应用服务器中其它各线程的时间就很少了。其表现就象排队一样。
3、大家可能认为W2000等的调度程序应该不会出现这样的CPU时间调度情况的,但我从“WINDOWS 任务管理器”中观查的结果却如我说的。
4、w2000的调度程序是以进程为单位进行分配的。
5、解决方法:1优化查询,尽量减少查询时间.2将大的查询分解为数个小的查询,在个查询间用SLEEP或Application.ProcessMessages将时间时行重新分配。这样的结果可能会使该查询使用更长的时间,却不会让其它的客户端发生排队的现象。
 
我的测试方法是:
(借用lich的程序)
实现应用服务器,定义方法 TestStr
function TDBSrv.TestStr: WideString;
var
s: String;
begin
query1.close;
query1.sql.text:='select * from abc';
s := IntToStr(GetTickCount);
query1.open;
s := s + ',' + IntToStr(GetTickCount);
Result := s;
end;

客户端调用的代码是:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
DCOMConnection1.Connected := True;
for i:=0 to 10do
Caption :=caption+inttostr(i)+'--'+DCOMConnection1.AppServer.TestStr;
DCOMConnection1.Connected := False;
end;
表ABC中的记录不能太多,200条就可以了。
该程序只是说明我进行测试的方法,我实际的测试程序比这个还要复杂些。
 
多人接受答案了。
 
后退
顶部