一个很菜的关于三层的问题,请大富翁们帮帮忙!

Description of your first forum.

一个很菜的关于三层的问题,请大富翁们帮帮忙!

帖子Fairys » 星期三, 2006年5月10日 11:35


我的服务器端已经做好,在RemoteDataModule中用一个SQLConnection进行
数据库端的连接,一个SQLQuery负责SQL语句的执行,一个DataSetProvider负责
与客端的通信。

第一种做法:(控件使用量少)
|------------------服务端-------------------------------||-------客户端------|
数据库 <-- SQLConnection <-- SQLQuery <-- DataSetProvider <--+--ClientDataSet
                                                            |--ClientDataSet
                                                            |--ClientDataSet
                                                            |--ClientDataSet
                                                            |--ClientDataSet
                                                            |--ClientDataSet
                                                            |--ClientDataSet
                                                            |--ClientDataSet

第二种做法:(控件使用量多)
|------------------服务端-------------------------------||-------客户端------|
数据库 <-- SQLConnection <-+ SQLQuery <-- DataSetProvider <--+--ClientDataSet
                          |                                 |--ClientDataSet
                          |                                 |--ClientDataSet
                          |
                          + SQLQuery <-- DataSetProvider <--+--ClientDataSet
                          |                                 |--ClientDataSet
                          |                                 |--ClientDataSet
                          |
                          + SQLQuery <-- DataSetProvider <--+--ClientDataSet
                                                            |--ClientDataSet
                                                            |--ClientDataSet

   客户端是多窗体同时运行的程序,每个窗体都有好几个ClientDataSet与服
务端的DataSetProvider连接,也就是说同一时间内同一程序可能有十几个或几
十个ClientDataSet与同一个DataSetProvider相连,这种做法好吗?效率会不会
有问题?书中的例子有些是按这种方式连接的,但有的又是一个ClientDataSet对
应一个DataSetProvider的方式连接的。我只想用效率最高占用资源最少的方法!
 
 
 

一个很菜的关于三层的问题,请大富翁们帮帮忙!

帖子Fairys » 星期三, 2006年5月10日 15:33


我的问题是不是太刁钻了?为什么没人回呢?
 
 
 

一个很菜的关于三层的问题,请大富翁们帮帮忙!

帖子Fairys » 星期四, 2006年5月11日 13:58


没人会吗?
 
 
 

一个很菜的关于三层的问题,请大富翁们帮帮忙!

帖子网中戏 » 星期四, 2006年5月11日 13:59


第二种种好。实践证明的。
 
 
 

一个很菜的关于三层的问题,请大富翁们帮帮忙!

帖子wu_yanan2003 » 星期四, 2006年5月11日 15:00


呵呵,DataSetProvider 是可以复用的,把它看成”池“,客户端的CDS看成内存使用,
每次取数据就动态的得到一个DSP,用完还给服务器端。如果有端态的,就保留不给其
它用户使用。另外服务器端DSP可以动态创建。等等。我N久前就是这样做的,使用率极高。
用完就使空闲。
参照下面代码:
procedure TRDMCardServer.SelectData(const sSQL: WideString; out pPrvName: WideString); safecall;
var
 ADOTemp: TADODataSet;
 i_iCount, i_iTag: Integer;
begin
 ADOTemp := ADODS40;
 i_iTag := 0;

 with frmServer do
 begin
   if GetDBConnectionState <> 0 then
     Exit;
 end;

 for i_iCount := 1 to pDSCount do
 begin
   ADOTemp := TADODataSet(FindComponent('ADODS' + IntToStr (i_iCount)));
   if ADOTemp.Active then
   begin
     Continue;
   end
   else
   begin
     i_iTag := i_iCount;
     Break;
   end;
 end;

 if i_iTag = 0 then Exit;

 with ADOTemp do
 begin
   CommandText := sSQL;
   try
     Open;
     pPrvName := 'DSP' + Trim (IntToStr(i_iTag));
   except
     pPrvName := '';
     Close;
   end;
 end;
end;

我有完成例子。你可以到http://www.delphibbs.com/keylife/iblog_show.asp?xid=18626
下来看看。
 
 
 

一个很菜的关于三层的问题,请大富翁们帮帮忙!

帖子thaibo » 星期四, 2006年5月11日 15:19


使用第二种方式.当然,如果采用DataProvider池也是可以的,相当于对第二种方式进行了优化.
第一种方式是不能采用的,因为,虽然CDS可以进行数据访问,但在进行数据更新时,可能会发生错误,因为,服务器端的DataProvider对不同数据的设置可能不同.
 
 
 

一个很菜的关于三层的问题,请大富翁们帮帮忙!

帖子wu_yanan2003 » 星期四, 2006年5月11日 15:43


把CDS仅仅看成客户端内存使用,不要用来提交数据。数据自己打包。提交,到服务器后解包,生成SQL语句。但MIDAS就是MIDAS,小孩的玩具一样,呵呵。终究难冲破铁网象雄鹰一样展翅高飞。
 
 
 

一个很菜的关于三层的问题,请大富翁们帮帮忙!

帖子Fairys » 星期二, 2006年5月16日 14:32


谢谢高手们的赐教!