服务器指定lifecycle为Session方式:
这是delphi默认属性。Session会为每个来自客户端的链接,建立一个线程来实例化。创建一个内在连接(线程),供客户端直接使用。这个线程和实例化并不释放,直到客户端中断连接。如果有100个以上客户端,那么你的服务器将会有100线程和实例,对服务器硬件和内存是个考验。

解决方案 »

  1.   

    它的释放机制如下:
    1、如果客户端正常下线,它释放;
    2、如果客户端非正常下线,如:网络断线,EXE出现异常,它也释放。所以,当客户端出现意外,已经造成服务器释放的情况下,客户端再现读取数据,就会出现
    再调用服务器的方法会返回错误
    Socket Error # 10054 Connection rest by peer如何解决,需要软件重新连接,才能正常读取数据。 
      

  2.   


    谢谢大侠回复,不过我想知道的问题是,我用的是http方式连接的服务器,为什么会有一个tcp连接(网络小白请原谅),而且当我把客户端的网卡禁用再启动后,我就无法连接服务器了,这时我就进行了重连,重连可以成功,不过之前那个tcp连接就死掉了,而且那个session创建的datamodule之类的东西也没释放。我在网上看服务器那边主动释放session都是基于tcp ip连接来的,http根本没人提及,但实际上如果客户端断网的话,会产生一个死session直到重启服务器,如果网络不太稳定的话,服务器感觉很容易耗尽资源,求如果处理
      

  3.   

    这种方法 建议你的connetion控件 动态创建 使用后释放 
    每打开一次会占用一个连接  close也不行 只能释放
    不然会一直占用连接的 直到内存占完 死机
      

  4.   

    感谢回复我看用webservice写的话里面就是每次创建后释放,但是这样子不会造成内存碎片过多的后果么,自己没能力来重新写内存分配机制,而且用短连接的话,第一次连上会比较慢吧,所以每次查询都会慢不少。综上所述,我想问问有没有能在datasnap服务器那么主动杀掉使用http连接服务器时产生的那个tcp连接
    网上查到都是用DSTCPServerTransport1Connect事件中获取tcp连接通道,然后杀掉的
    而TDSHTTPService没有类似的事件,也获取不了连接通道用http连接的主要看资料说可以穿透防火墙,外网访问用这个好
      

  5.   

    我试过的 不造成的  同样一个方法 在IE里面调用 一直按f5刷新 机器还是正常的  
    使用前者 按几次 就挂掉了
      

  6.   

    好吧,这样子用是可以用,不过更希望有http长连接的处理方案,一周后如果没有更满意回答就结贴吧
    ps这个东西搞完后还是去学。net吧,用delphi的感觉越来越少了
      

  7.   


    谢谢大侠回复,不过我想知道的问题是,我用的是http方式连接的服务器,为什么会有一个tcp连接(网络小白请原谅),而且当我把客户端的网卡禁用再启动后,我就无法连接服务器了,这时我就进行了重连,重连可以成功,不过之前那个tcp连接就死掉了,而且那个session创建的datamodule之类的东西也没释放。我在网上看服务器那边主动释放session都是基于tcp ip连接来的,http根本没人提及,但实际上如果客户端断网的话,会产生一个死session直到重启服务器,如果网络不太稳定的话,服务器感觉很容易耗尽资源,求如果处理我的DataSnap服务器,试过当关闭网卡,造成tcp ip断线,服务器的动态连接会自动释放。
    我在服务器上弄了一个计数器,显示释放了。
      

  8.   

    这是DataSnap的基本功能,这做不到。谁都不能使用的DataSnap了。
      

  9.   


    可是我的就是没释放啊
    如果我用tcp连接服务器,加上KeepAlive 后,禁用客户端网卡,重新启动网卡后,过了设定时间,服务器会断掉tcp连接,但如果网卡不启用,那个tcp连接也一直都在。
    如果是http连接服务器,我就发现那边有个什么sessiontimeout,不过设置成12000,禁网卡后过了12秒也不会自动断tcp连接啊。
    请问大侠有什么特别的设置吗?万分感谢
      

  10.   

    大侠如果有时间的话,可以看下xe6安装目录下有个\Embarcadero\Studio\14.0\Samples\Object Pascal\DataSnap\Authorization目录,编译里面的AuthServerProject.dproj和SimpleDelphiClient.dproj,然后把客户端放一台机器填写host,选择http后,调用ReverseString函数成功,禁用网卡。服务器用netstat -ano | findstr "8081"命令查看,可以看到一个连接8081的tcp连接一直是ESTABLISHED 的状态
      

  11.   

    建议你在服务器,增加一个连接计数器,查看断线后是否内存(TRemoteDataModule)释放。
      

  12.   


    我是在TDSServerModule的DSServerModuleDestroy、DSServerModuleCreate事件里面加了断点,如果客户端做完查询操作,创建了TDSServerModule,正常关闭客户端时,会进入DSServerModuleDestroy断点;如果是客户端断网重连,发现又重新进入了DSServerModuleCreate,而之前创建的那个TDSServerModule,只有当关闭服务器时才能进入断点