我用的是DELPHI+ADO+SQL的三层结构,客户端使用TSimpleObjectBroker来提供容错和简单的装载平衡,动态配置2个中间件服务器地址(用IP)。在Internet上使用。
    现在采用了李维书上的容错技术:
    try
      sktcnt.Connected:=false;
      link_sob.SetConnectStatus(sktcnt.Address,false);
    finally
      try
        addr_tmp:=link_sob.GetComputerForProgID(sktcnt.host);
        sktcnt.Address:=addr_tmp;
        sktcnt.Connected:=true;
        result:=true;
      except
        result:=false;       
        MessageDlg('没有服务器可以使用! ',mtWarning,[mbOk],0);
      end;
    end;
    在应用更新或调用服务器方法时都可以正确转到另一服务器上正确执行,但转换到另一服务器后,没有打开过的Tclientdataset可以检索到正确的数据(用Commandtext),而原来打开过的Tclientdataset则在重新执行检索后取不到数据。
    还有我的Tclientdataset的FetchOnDemand都是false,Packetrecords是-1。
    有谁碰到过这样的问题吗???
    分可以加。

解决方案 »

  1.   

    原来打开的 ClientDataSet 先 Close 试试
      

  2.   

    小弟想请教一下,ADO也能算一层吗?
    如果算的话,那我们做的任何用ADO连接数据库的软件都是三层的了?
      

  3.   

    TSimpleObjectBroker太简单了,不适合在大项目中使用。
    最好用硬件的双机集群,不用编程,效率很好。
      

  4.   

    to hiflower(花) :在调用commandtext之前我都先close的,在连接断开后,如果clientdataset原先没打开,要到open时触发异常,如果原来是打开的,在close时就触发异常了,重新取得一个连接后,前者可以取得正确结果,后者则什么都没有。
      

  5.   

    to ChengGuiNan(程桂男) :我用socket连接中间件,ADO指的是中间件与数据库的连接方式。
      

  6.   

    Tclientdataset是否Applyupdates一下?
      

  7.   

    FetchOnDemand为真的话,应用服务器要维护客户的状态,更不可能转到另一个服务器获取数据。
      

  8.   

    关注中!
    另外请问,你所谓的三层结构:应该是delphi+中间件+ 数据库服务器吧?
      

  9.   

    delphi+中间件+ 数据库服务器 这算不算三层体系呢!
    客户端+服务端+数据库  这算不算三层体系呢!
    请指教!
      

  10.   

    呵呵,这个写法还有这么多争议。
    再声明一下:客户端(SOCKET)+服务端(RDM+BORLAND SOCKET SERVER)+数据库(SQL2K)
      

  11.   

    TSimpleObjectBroker的属性(TServerCollection)有没有事先设置好
      

  12.   

    TSimpleObjectBroker,设好了,是初始化时动态设置的。
      

  13.   

    在TSimpleObjectBroker换服务器之前把全部clientdataset关闭应该没问题了
      

  14.   

    我是先关闭的。
      try
        with dm.tmp_cds do begin
          close;
          commandtext:=s;
          open;
        end;
      except
        if dm.CheckConnectionState then         //判断并更换服务器
          with dm.tmp_cds do begin
            close;
            commandtext:=s;
            open;
          end;
      end;如果该控件原先没执行过,在OPEN里触发异常,在服务器更换的状态下,可以取得数据;
    如果该控件原先已经执行过,在CLOSE里触发异常,在服务器更换的状态下,不能取得数据;
    请帮我看看这样调用有没有问题