目前在做一个管理系统,采用三层结构,客户端采用SocketConnection,差不多有10几台客户端在使用系统。
每次在客户使用一段时间之后,就会出现客户端退出后即无法连接服务器,新的客户端也无法连接服务器,会出现无限时间等待,但如果已经连接上的客户则可以正常使用。
重启服务器之后又可以,但一段时间之后又会出现相同的问题。并且非常频繁,差不多每天都会有相同的问题?请问如何解决?

解决方案 »

  1.   

    客户端和应用服务器都在局域网内,服务器采用Mulitple Instance 和Apartment的Treading Model。
    应该不是SocketConnection的问题,如果某个客户端没有退出,则可以正常使用。但新的客户端却连接不上!觉得非常奇怪!
      

  2.   

    我上面说的不是应用服务器,而是指数据库服务器。
    你的远程数据模块的DataSet是不是在设计期就是打开的?如果是,把它们全部关闭,客户端连接后,存取数据时它们会自动打开的。是不是这个原因导致连接不能释放?
      

  3.   

    还有,你的数据库连接是什么元件,ADO?
      

  4.   

    呵呵,可能是我说得不够清楚!
    1:所有的客户端连接都共享一个数据库服务器连接
    2:数据库连接和数据集元件均采用ADO
    3:所有的远程数据模块的DataSet都是用完后立即关闭的!
      

  5.   

    这就不好说了,ADOConnection是放在远程模块上的?
      

  6.   

    不是,ADOConnection是放在本地数据模块上的!
      

  7.   

    网络中断之后,对应的远程数据模块结程应该会自动释放的吧!
    ==================================================================================
    很难说,你可以在应用服务器上临时加个Label显示用户连接个数,每次用户连接和退出看是否有变化
      

  8.   

    建议使用netstat查看连接状态
    怀疑是TCP的连接没有正常关闭
      

  9.   

    那应该怎样去处理没有正常关闭的TCP连接呢?
    正常情况哪此原因会造成相关方面的问题呢》?麻烦各位高人指点一二!
      

  10.   

    回复:zhmnsw(糖醋鼻子) 是不是关闭时没有释放连接?
    --------------------------------------------------------------------------
    这种问题基本不存在!这几天都在加夜班到3-4点钟啊!
    上天给我的时间真是太少了!真诚希望各位兄弟能给点在解决相关问题中的一些经验?
    我会很快结贴的!先谢了!
      

  11.   

    估计最大的可能是你的Socket Server代理服务器的配置出了问题一般来说Socket Server的默认端口是211,而且允许的最大连接数是10,请将它(Thread Cache Size 这一栏代表最大允许的客户端连接数)改大一些如200,然后Apply一下
      

  12.   

    绝对不是Socket Server的问题
    那个10是线程池大小。
      

  13.   

    yongshiok(大勇)说的对,Thread Caching是线程池大小,
    我今天现场跟踪发现,某个客户端退出之后,在应用服务器中的远程模块已经释放,
    但是在Socket Server中的Users连接仍然存在!不知是何原因?据目前的情况来看,造成客户端无法连接服务器应该是这个原因造成?
    但是为什么客户端退出后,应用服务器中的远程模块已经释放,而Users中的连接仍然存在呢?
      

  14.   

    楼主还没搞定阿!改用DCOM连接试试。
      

  15.   

    呵呵,是啊,急啊!今天我在本地测试的时候发现了一个问题!我同时开启了10几个测试程序,用定时器向服务器数据库表中插入一条记录!
    会不时的弹出“连接忙不能执行其它命令”
    我在跟踪服务器的过程中,发现了一个问题:服务器跟踪过程中,会造成所有客户端不能正常使用,我会任务管理器强行退所有客户端!
    这时就出现了与客户端相同的情况:所有客户端在应用服务器中已经注销,
    可在Socket Server中,所有的连接都没有Disconnet掉!然后新的用户应不能再登陆了!可为什么在实际应用中,为什么也会出现这样的情况呢!如果不是在服务器跟踪过程中,则运行很长时间都没问题,只是会不时的弹出“连接忙不能执行其它命令”,不影响服务器和客户端任何操作!
      

  16.   

    把ADOConnection放在远程数据模块上
      

  17.   

    回复:madyak(无天) 把ADOConnection放在远程数据模块上
    -------------------------------------呵呵,那我还不如用二层呢!问题的关键应该不是出在这里!关于弹出的提示,客户端系统都可以解决掉,关键是客户端不定时的不能连接服务器的问题!
      

  18.   

    SocketConnection有BUG...不建议用了. 我公司在用的当时居然是问 borland拿到源码后自己处理的...来解决连接后不能再连接的问题. 用COM+吧.
      

  19.   

    socketconnection 本来就有原代码的。
      

  20.   

    我刚开始回复就说过,我以前碰到过这种问题,改用DCOM连接就好了,现在看来,应该还是这个问题,还是改DCOM吧!
      

  21.   

    1.换DCOM不知能带来多大的问题,我也没测试过
    2.源程序端会有多大的改动,因为这个系统算是一个中型的系统了!
      她关系到企业的大部分部门,十几个主模块(上百个子模块)的生产型企业应用实时管理系统。
    3.当初选用SocketConnection时,主要考虑的是客户的老板需要远程访问(通过ADSL远程访问)所有目前时间上也不允许采用DCOM了!目前我正在分析socket的源程序,希望能找出解决的办法!在其中我有查到,如果应用服务器端如果是一个以上的CPU的,好像会出问题的!
    而且我现在客户的服务器也正好是双CPU的!会不会真的是这个原因造成的呢!
    呵呵,不行的话,让他们加一台应用层服务器试试,与数据库服务器物理分离!我会急时的发布解决问题的过程!如果大家有兴趣的话,可以多来这里坐一下!
      

  22.   

    好象双CPU是有问题,网上有专门修正过的版本
      

  23.   

    不知谁有Delphi2006的SockSvr.exe的执行文件和相关源程序,可不可以发给我一份!真的是太急了!我也没有Delphi2006!这几天一定要解决这个问题啊!都拖了几个星期了!
    而且周末还得回一趟老家(家里有事要办),弄得没办法向客户交待啊!
      

  24.   

    我现在也碰到Scktsrvr的问题,跟楼主有点不一样。可能跟双CPU有关系,可以先用普通的机器充当一下应用服务器,进行测试
      

  25.   

    老版本的 Scktsrvr 是不支持多CPU的,换个高点版本的 Scktsrvr 就可以了.
      

  26.   

    我现在用的都是Delphi7的了,而且ScktSrvr都是Fix后的版本,但还是不行!
    明天去买Delphi2006试试!
      

  27.   

    上次走得太匆忙了!没能急时结贴!
    今天才赶回来,先把贴结了吧!
    目前,应该说不是ScktSrvr的问题了,经过这段时间来的检查,
    还是我的服务器这边的程序设计上有点BUG,主要是集中在客户端的数据批量提交上!
      

  28.   

    ScktSrvr的Fix后的版本是可以使用的,采用SocketConnection连接的技术还是比较成熟的!大家可以放心使用!
    如果我们在本身程序设计上,对数据的处理比较完善的话,数据的传输执行效率还是比较不错的!