近日实做一多层系统,有如下问题不明,特向诸位求教
问题1:李维书中讲到,ClientDataSet的Locate及SaveToFile方法都会从
AppServer下载全部数据到本地,但经我实验,D7中的ClientDataSet执行这两
个方法时并不会从AppServer下载全部数据。从D5到D7,已经过了一些年头,
我相信大多数程序员对于多层开发的概念大多都来自李维的三本书,到现在
midas技术已发生了一引起变化,大家在开发的过程中发现有哪些差异,望能
在此公布于众,减少我等新手的障碍。100分
问题2:我用SocketConnection做连接,但到客户机执行的时候出现如下错误,
有些不明白,请大家帮忙:Windows socket error:协议家族尚未配置到系统
中或没有它的存在迹象(10049)on api connect。在我本机已经运行通过,服
务端是我做开发的机器,scktsrvr已经运行。100分
问题3:李维书中讲到,当将ClientDataSet设为不等于-1的值时,将
FetchOnDemand设为False,远程服务器即为无状态的,为了能使GetNextPacket
取到正确的数据,他还写了一大段的代码。我发现,在D7中如果按以上设置,
直接调用GetNextPacket即可取得正确的数据,多个客户端同时运行的时候也
不会出错数据相互干扰的现象。那么我们所建的是否是一个无状态的服务器,
如果是,那还有必要写那么多的代码吗?如果不是,那么Remote Datamodule
是不是不能作为无状态服务器?如果服务端是用Transaction Datamodule的
话,按以上设置,则直接调用GetNextPacket并不能获得我们希望的数据,每
次都只能取最前面的几条记录,我相信这种现象表明服务器是真正无状态的,
这是否也反证了Remote Datamodule根本就是一个有状态的服务端。100分
问题4:com+的正确配置一直是我没有解决的问题,请问哪位有成功配置的经
验,望能告知,不胜感激。问题给分200分,不够可再加,但求解决

解决方案 »

  1.   

    问题2是因为IP地址错误,我也曾碰到这个错误提示,改一下客户端的IP就可以了
      

  2.   

    问题2的原因已经找出来了,是因为我的服务器端是win2000 Professinal,而客户端的测试用机是win2000 Server,服务端改为Win2000 Server后正常。如果服务端是professional的话,在win2000 server 的客户端上运行scktsrvr后也可正常访问,只是有些感觉怪怪的。
    其它问题征求答案中
      

  3.   

    关于问题3
    李为的书上那样说过吗?好象有点印象,等我回去查一下!
    不过我认为,只要clientdataset的packetrecords不是-1 那么你的服务器端就一定是有状态的。在midas环境下由于你没有释放过远程数据模块,所以状态总是存在。
    而对于translation datamodule 由于在com+环境下运行,而你可能是没有使用object pooling ,所以每次GetNextPacket后,远程对象都会释放,其连接由Stub维护,所以每次GetNextPacket都会重新active模块。也就会出现你说的情况。
    不知道你说的com+的配置是指用ide Wizard开发时的配置还是发布的配置?先回答这些吧,一己只言,错了大家别见笑,因为我也是新手:)
      

  4.   

    ytwxw(wxw) :确实如你所说,通过事件探测器发现Translation DataModule在我取完数据后都会断开与数据库的连接,如何实现Object Pooling呢,对此我很模糊,还望指教。
      

  5.   

    关于Com+程序的配置问题,我是指发布时在服务器和客机端的配置。
    我发现,在用SocketConnection进行连接的时候,客户端的配置比较简单,且不须在客户端安装应用服务器代理,我不知道用这个连接会不会影响Com+程序的某些功能。而用DCOMConnection进行连接我从来就配置成功过,有过成功部署经验的请指教。
      

  6.   

    用SocketConnection进行连接,配合SimpleObjectBroker可自动实现负载均衡吗,请教 中
      

  7.   

    1. Locate 在 d6(补丁后), d7 可能有所改进, update list 中已列出, 但仍是应该小心使用, 不完整的数据 Locate 不能表示问题(要记录的在下一个包中), 很容易产生误导, 所以李维书上这一节讲得还是不错的.2. 不管是 server/professinal 都是可以作为 socket 服务器的, Borland 中的 Socket 都是以 TCP/IP 为基础的, 所以你应检查 windows 的 IP 设置, 比方是否正确安装, 是否同一网段...3. 李维的说法是正确的, 他只说明了无状态对像的写法, 但他没有提供 object pooling 代码, 只有 pooling 后的对像才 "需要" 无状态. 
    你的每个客户端, 都在一个服务器 Apartment 线程中, so 1 vs 1 GetNextPacket 就没有问题. 因为它 "不需要" 无状态.
    怎样才能实现 object pooling 是关键了, 关于此类的书和讨论很多, 但都没有代码, 我们需要的不只如此, 我们要实现...(Borland 有呵 demos 中 Pooler 和 SharedConn 结合可以实现)
    用 msn 查找姓名 [email protected], 可能我能提供一点建议4. 关于 MTS/COM+ 技术我已不想再参与, MS 的 DCOM 我已经无法忍受, 现下在学习 CORBA 中...
      

  8.   

    另 COM+ 和 MTS 我试过几次, 不知道其它语言如何, 但 delphi 中好像只是 resource pooling 而不是 object pooling, MIDAS 造成
      

  9.   

    我再插一句嘴 to sonyaiwa: SimpleObjectBroker 不能实现平衡, 关键原因是 SimpleObjectBroker 无法得知可用的服务器列表, 负载均衡在 MS 的 COM/DCOM/MTS/COM+ 都不太可能实现
      

  10.   

    TOMWLD(笑天) :关于object pooling 
    thread :both
    thans data model的pooled属性要为true
    Type Lib的com+ page要选中object pooling
    最后在com+ manager中要将组件属性激活项中启用对象共用
      

  11.   

    comanche(太可怕):我试过的 如果如我上面的设置 对象确实能够共用 
    在com+ manager中是可以看到共用的对象不会马上释放
    难道是我将resource pooling 跟object pooling  搞混了?
      

  12.   

    TOMWLD(笑天)对于com+的发布 我还没有试过呢 我也是新手 不过我认为用socket 确实应该好配置一点。我反正是偏向于用socket的 见笑了 我也是新手:)
      

  13.   

    谢谢ytwxw(wxw),按你所说的,数据库能保持连接,但是却不会释放了
      

  14.   

    ytwxw(wxw),我的错,com+ Object会过一段比较长的时间才会释放
      

  15.   

    ytwxw(wxw),dllhost默认是3分钟后释放
      

  16.   

    sonyaiwa(aiwasony) 用simple objectbroker是可以实现负载平衡的无论是socket还是dcom都可以,我试过
      

  17.   

    TOMWLD(笑天) 
    1:分布式下是不应该用locate的
    2:你已经解决
    3:你应该也明白了吧?用object pooling结合李维的技术可以解决的
    4:关于配置可以看com+ manager的帮助
    还不发分?
      

  18.   

    基于安全性,dcom使用ntlm安全协议,对于目录服务,dcom使用dns。mts组件必须是一个动态链接库
    mts组件必须有标准类工厂,必须在类型库中描述,必须引出dllregisterserver()并且自注册clsid,progid,接口,类型库。
    mts对象的去活:
    通过调用setcomplete()或setabort()
    事务已经放弃或提交
    最后一个客户释放对象资源的释放可使用setcomplete(),setabort()
    使用iobjectcontext接口来访问对象描述表
      

  19.   

    Thanks comanche(太可怕),ytwxw(wxw) 总算有了点眉目,结岾