我用现在写的一个软件里面要求多个(1-500)客户端连接服务器,
服务端用Remote Data Module+ScktSrvr.exe
客户端用SocketConnection+ClientDataSet本来一切正常的(在客户端连接数少的时候)
一但客户端增加到68个以上时,就出现错误,在客户端提示:未指定的错误很问高手们有没有方法解决,是不是用ScktSrvr.exe就只能连接68台
我调试过是ScktSrvr.exe里面抛出来的错误
如果ScktSrvr.exe不能满足我的需求,有什么好的解决方案,前提是客户端尽可能少改动

解决方案 »

  1.   

    ScktSrvr是什么版本的?估计BDS2007所附带的版本性能会稍好一点.
      

  2.   

    留个Email我先把ScktSrvr.exe和Midas.dll发给你(后者看看有没有兼容问题,具体没有测试过).1.要改善ScktSrvr.exe的负载能力,除了通讯(新版的通讯上已经有所改进)比如使用完成端口,还要改善Delphi在MPS(多核/多CPU)系统当中的内存管理产生的瓶颈.
    2.制约RPC(远程过程调用)客户数的另外一个问题就是操作系统当中的线程的共享,而对于一些阻塞性函数,那么这个就会成为一个关卡.你说你的系统可以负载1万个用户,那万一这一万个用户当中有1000个用户在执行一个阻塞过程,那么是否意味着就会有一千多个线程被占用,那么系统又还能分派出多少个线程出来给剩下的九千个用户使用?而是否这九千多个用户还有可能存在阻塞?远程过程调用,本身可以很好地处理封装问题,但是这个封装的缺陷,肯定制约着相应的应用逻辑.早先刚听说完成端口如何如何强大的时候,确实有设想过使用I/O完成端口来对Borland Socket Server进行相应的改进,但是这种封装所存在的串行阻塞,正好与完成端口当中的并行化拆解形成一个无法统一的局限性.而另一个全局的内存管理器,在MPS当中的并行线程竞争导致性能的下降(测试结果表时,在一个MPS系统当中,分派给一个高并发服务的Delphi程序多个CPU执行单元反会相比分派给它单一一个CPU执行单元性能更低,而且低得不只是一点点).而处理这一个问题的办法则是在非必要使用默认内存管理器的地方采用独立的内存管理机制,对一些经常性创建和销毁的类,进行对象池化以重用现有对象来达到性能上的提升.对于远程过程的调用,则换原来的进程内COM或DCOM为COM+(COM+当中对COM的调用有相当的优化,当用户增加时会自行开启一个DLLHOST进程来承载,从而省去了一些进程级限制所带来的麻烦).
      

  3.   

    使用ScktSrvr,要注意一个问题,就是有多少个连接就有多少个连接数据库,数据库用户登陆数是有限的,你可以去网上找找相关的数据库用户登陆最大数。
    如果需要做成三层结构,建议自己做一个中间层,作为数据转发的程序,客户端每次取完数据立即断开释放资源,这样就可以保证数据库的稳定性
      

  4.   

    数据库链接可以共享,但是一定要动态建立TAdoQuery查询控件,用完后立即释放。
    我自己做了一个SOCKET server,在服务器端对查询结果动态打包然后传递给客户端,客户端解包后传递给clientdataset,效果不错。
    另外,DELPHI写完成端口,稳定性是一个问题,网上能够找到的,或者我自己写的,都可以用工具压垮。但是我用VC写的模型,可以固若金汤,服务器每天200人左右,几个月都没有问题。
      

  5.   

    听说用webservice也可以实现,不知道谁有这方面的经验吗?
      

  6.   

    做成短连接就可以了,即用的时候才去连,用完马上断开
    webservice也是短连接的
      

  7.   

    理论上来讲,相比,WebService比Socket方式性能要更低.
      

  8.   

    Connection断开后我原来用的DBgird是不是就不行了?我还没去试
      

  9.   

    已经可以了,但是我运行到121个客户端后服务端抛出存储空间不足的异常,
    不知道是什么原因,unsigned兄知道吗?
      

  10.   

    建议详细说明一下,比如使用的DCOM还是普通的COM,还是COM+.如果只是单纯的COM DLL,那出现这样的问题一点不奇怪.
      

  11.   

    我的服务端用 Remote Data Module + ScktSrvr.exe
    是exe的形式运行服务
      

  12.   

    使用ScktSrvr,要注意一个问题,就是有多少个连接就有多少个连接数据库,数据库用户登陆数是有限的,你可以去网上找找相关的数据库用户登陆最大数。 ----------------
    用數據庫連接池
      

  13.   

    我自己做了一个SOCKET server,在服务器端对查询结果动态打包然后传递给客户端,客户端解包后传递给clientdataset,效果不错。 -------------------
    可以兼容 SocketConnection 嗎?
      

  14.   

    我Delphi写的完成端口的服务器,在线用户一万多,一切正常。不过我不清楚所谓的用工具压垮是怎么个压法,怎么垮的?
      

  15.   

    我想看看 一萬多的在線用戶的IOCP 是如何設計的
      

  16.   

    一个列表。难度不是承载多少在线,对于Delphi程序,首先是要能够将可用的资源利用上来,其次是稳定地长时间运行。
      

  17.   


    其实我就是将一张表生成一个树形,而且树的层任意个,我能想到的只有这种循环去查表建树,
    unsigned 老哥有生成树的代码分享下吗
      

  18.   

    生成一个树形?展BOM?使用多个逻辑表的Left Join一次性就可以展出多阶,如果不是太过于复杂的话,完全可以一次性展出,对于多余的部分再继续按同样的方式展开。以前涉及的比较多就是五阶到七阶,所以我就采用一次性展七阶,而这样的话,对于十四阶以内的最多也只有两次,而单阶展开的话,需要十四次。
      

  19.   

    呵呵,我知道ScktSrvr连接有限制,倒没有听过68台的限制,应该是楼主的方案设计有问题而引起的.
      

  20.   

    我的表结构是这样的:ID   DID  Caption
    1    1    开发部
    2    2    营销部
    3    3    服务部
    4    1    网络开发
    5    1    数据库开发
    6    4    张三
    7    5    李四
    8    2    王五
    9    3    何某在我的软件里的TreeView里显示成:开发部
      +-网络开发
        +-张三
        +-李四
      +-数据库开发
    营销部
      +-王五
    服务部
      +-何某用这一张表就可以建出无限制层数的树,只是我建的方法比较笨,我是从树顶开始递归查询去建的,
    不知道哪个大侠有没有更好更快查询更少的办法吗,请不吝赐教
      

  21.   

    上面写错了,特此更正:我的表结构是这样的: ID   DID  Caption 
    1    1    开发部 
    2    2    营销部 
    3    3    服务部 
    4    1    网络开发 
    5    1    数据库开发 
    6    4    张三 
    7    5    李四 
    8    2    王五 
    9    3    何某 在我的软件里的TreeView里显示成: 开发部 
     +-网络开发 
      +-张三 
     +-数据库开发 
      +-李四 
    营销部 
     +-王五 
    服务部 
     +-何某 用这一张表就可以建出无限制层数的树,只是我建的方法比较笨,我是从树顶开始递归查询去建的, 
    不知道哪个大侠有没有更好更快查询更少的办法吗,请不吝赐教
      

  22.   

    开发部  
     +-网络开发  
      +-张三  
     +-数据库开发  
      +-李四  
    这个可以看成是(假设三阶):
    开发部  #NULL   #NULL   
    开发部  #网络开发 #NULL
    开发部  #网络开发#张三   
    开发部  #数据库开发#NULL
    开发部  #数据库开发#李四   
      

  23.   

    zl这种无限制层数的树应该只需要查询一次就可以解决问题:select * from 表名 order by did,id
    cds.frist
    Isfound:=false
    while not cds.eof do
    begin
      Isfound:=false
      for i:= 0 to TreeView.Items.count-1 do
      begin
        if TreeView.Items[i].Text = cds.fieldvalues['did'] then   //这个地方可能每个节点需要一个结构体存储id,did,caption信息
         begin
          TreeView.Items[i].addchild()
          Isfound:=true;
          break;   
        end
      end
      if not isfound then
        treeveiew.add()    //根节点增加
      cds.next
    end//cdsn 论坛的文本编辑器真是太差了
      

  24.   

    to sunchunqian
    谢谢你提供的方法;
    你的方法对我上面说的情况来说是可以的,由于我的疏忽,我以为上面的那表达我的意了,结果还是忽略了一样东西
    那就是排序ID  DID  Sort Caption   
    1   1   1   开发部  
    2   2   2   营销部  
    3   3   10   服务部  
    4   1   4   网络开发  
    5   1   5   数据库开发  
    6   4   6   张三  
    7   5   7   李四  
    8   2   8   王五  
    9   3   9   何某  
    10  10   3   业务部
    11  10   11   彭某Sort 在新建时=ID值,在用户自定义排序时(提供上移和下移功能,移动其实就是让两条数据的Sort值交换达到目的)因此排序只能用Sort排,但又有个问题,只按Sort排还不够,就像上面的,ID=3的Sort是10,而其下级人员何某ID=9,Sort=9(这各情况只需用户将业务部上移,则Sort与服务部交换)那就变成下级排在上一级前面,用你的建树方法时也就让何某变成了根结点了。我现在就是用你的方法,但是加上了递归,就是在第一次查到的结果中操作,速度是快了,但总感觉我的递归写的不够好你有什么高招能解决一下吗?这贴我马上就要结了,提问题的主要内容不需要解决了,因为我决定用ASTA或RemObjects用实现,现只想解决这个树的问题。
    注:unsigned兄,你的分不会忘记给的 :) 谢谢你的热情。
      

  25.   

    select 
      a0.caption,a1.caption,...a[n-1].caption,a[n].caption
    from
    mytable as a0 /*顶级*/
    left join mytable as a1 /*二级*/
        on a0.id=a1.did and a1.id<>a1.did
    ...
    left join mytable as a[n] /*第N级,N是有限制*/
        on a[n-1].id=a[n].did  and a[n].id<>a[n].did
    where a0.id=a0.did按上面这个查询,一次可以查N阶,由于关联,自动进行了排序,并且join可以很好地利用索引进行快速的检索。这里的顶级,只要修改一下条件,可以从第N阶开始作为当前查询的顶级节点。
      

  26.   

    我感觉楼主的数据库字段定义含义不是很清晰,不知道楼主DID字段的含义是什么?
    我认为DID字段应该是本记录的父节点的ID,如果没有父节点DID=0
    “Sort 在新建时=ID值”我认为应该改成:Sort 在新建时=(select isnull(max(sort),0)+1 from 表名 where did = 本记录.did )因此根据我的定义方法:ID  DID  Sort Caption    
    1   0   1   开发部   
    2   0   2   营销部   
    3   0   3    服务部   
    4   1   1   网络开发   
    5   1   2   数据库开发   
    6   4   1   张三   
    7   5   1   李四   
    8   2   1   王五   
    9   3   1   何某   
    10  0    4   业务部 
    11  10   1    彭某关注楼主的帖子是因为我也在用SocketConnection开发应用,目前还没有68个客户端,所以还没有发现楼主的那样的问题,但以后可能会面临类似的问题,所以非常关注楼主这个问题的解决方案,如楼主最终用了什么好方案还希望能够告诉我。呵呵。关于三层我还有些问题没有想到好的解决方案,希望能够向楼主请教。我qq:12470312 一般在线隐身
      email: [email protected];[email protected] 
     
      

  27.   

    在我的应用中 Sort 必须唯一的那样我可以在多部门同时显示时排序也准确
      

  28.   

    将Adoconnection的KeepConnection设为False;只有在需要的时候才去联连.
      

  29.   

    在我的做法里多部门同时显示也是排序的,而且整个部门包括它的子节点也可以上移下移,部门移动时也是一样按照你的方法交换两者的sort值就可以了。
    最上一行sql语句:
       select * from 表名 order by did,sort
      

  30.   

    严重BS楼上的广告,你们这样把人拉走也成就不了你的事业这样分流只会让每个地方人气越来越少,这类人要坚决打击。我的问题解决了,改用ASTA了,很方便,达到了我的要求,据网上的价绍来看,RemObjects比ASTA总体上来说要好,但是比ASTA复杂,先用着吧,有时间再转成RemObjects,结贴了。