中间层问题,请各位高手进来,谁能解决定当送足500分以上(300分)

  • 主题发起人 步步高
  • 开始时间
to szf
我照你的方法试了,可以用
但有一个问题,我的中间层是有状态的比如我在客户端设包一个一个取,这时中间层就
有状态,所以我建的共享池就出错 '提示: qy_cwp(中间层的一个query) 不能在一个打
开的数据集进行操作

 
由于BDE的限制(Session<48),所以你这种情况必须用Session Pooling来解决。
但你的中间层是有状态的,直接的Pooling当然就不可能了,需求是矛盾的。
我想到有两种解决方法:
1、做成逻辑四层,应用服务器实现中间两层,跟客户端相连的做成有状态的,跟数据库相连的
做成无状态的Pooling Object。
2、用李维的三层系统应用篇所介绍的"鱼和熊掌兼得之法"。也就是客户端ClientDataSet在
GetNextPacket时,把自己的最后一条记录打包传回去,而服务器则重新(因为是无状态
所以必须假设每次都是新请求,必须重新打开)打开数据集,打开后,Locate到跟客户端传回来
的记录一样的记录时,也就是数据集游标已经回到有状态对象情况下时的位置了,然后就可以
回传数据记录了。--不知道解释得对不对,我理解也就是这意思。
两种方法各有特色,从工作量来说,第一种改动比较大些,而且自己编程上的代码可能会
多些,但都在服务器上修改。而第二种则在服务器和客户端的程序都要修改,但工作量
比较少。
 
不好意思,我因为不知道你的中间层的无状态是什么样的,所以才这样说。可能理解也不一定
正确。因为直接看起来,你的中间层好象也有状态呀,它说出错是怎么回事。
如果能把关键部分的代码段看一下,就肯定有正确的答案了。(zqszf@21cn.com)
 
to szf
1.clientdataset 的 packrecords 由-1 设成 15 这是产生状态原因一
2.中间层表头表体设关联 如表头(query) select dhao00,spdm00 from table_head
表体(query): select dhao00,sl0000 from table_body where dhao00:=dhao00
然后表头表体用datasourse 连接.(相当将 表体作为表头的一个字段).
你说的第二中方法是可以但对我来说改动太大了,第一种四层的我有点不明白.
我想你给我的代码能不能不用共享池
 
不明白你的代码是怎么样的--"表头表体用datasourse 连接.(相当将 表体作为表头的一个字段)"
你的远程数据模块的 initialization 里写的是
RDMFactory := TComponentFactory.Create(ComServer, IAppSvr,
Class_IAppSvr, ciInternal, tmApartment);
还是
RDMFactory:=TComponentFactory.Create(ComServer, IAppSvr,
Class_IAppSvr, ciMultiInstance, tmApartment);

 

RDMFactory:=TComponentFactory.Create(ComServer, IAppSvr,
Class_IAppSvr, ciMultiInstance, tmApartment);
 
多人接受答案了。
 
步步高, 您最后是如何解决问题的。请将解决办法公布到网上。毕竟大家都在为您的问题
想办法。
 
顶部