客户端调用中间应用服务器的接口函数,接口函数中调用某模块(DLL形式)的函数,模块函数调用数据库储存过程,这样实现的处理过程
请问:
    一般情况没什么问题出现,但有时(不是很多),客户端等待返回时死机。检查如下:网络状况良好,服务器端运行良好,重起客户端就好了,但是为什么会死机呢?
    由于这种机会不是很多(当然出现了也是致命的,因为很有可能客户端发送数据了,没收到返回,但服务器端确实收到数据并且执行了操作,这样,客户端再发数据和操作命令时,就会多执行一边操作),错误的重现性很小,因此比较难查找原因,因此,想编写个这样的小程序:
    <1>监视客户端与服务器端的底层通信情况,即可以检查客户端的进程运行情况,资源占用等等,有点像资源管理监视器一样,但要详细些
    <2>检查客户端在一段时间内得不到返回的原因,服务器端死机,或是客户端计算机与交换机网络出问题,或是服务器端计算机与交换机网络出问题
    <3>检查服务器端的状况,包括每个客户端连接的进程运行状况,资源占用情况等等(**)
    小弟被这三层开发中通信双方死机迷惑很久了,特请教一下,上面我描述的问题是由于什么原因引起的,以及后面的问题能不能实现,请各位在三层开发中比较有经验的高手们指点一下,小弟谢谢了

解决方案 »

  1.   

    就是构建三层的最基本的,
    客户端使用TSocketConnection连接AppServer
      

  2.   

    多谢大家的回答!其实我是这样使用的,客户端调用远程应用服务器接口函数,中间应用服务器接收到数据和处理逻辑命令后进行逻辑处理,完毕后将数据写入数据库中(使用导储存过程),并返回状态信息给客户端程序
    主要是这种模式运行,数据的返回数好像不能怎么影响的现在问题是TSocketConnetction连接,怎么控制,以确保不死机啊,也就是即使网线断了,客户端怎么断开啊,现在是一直等待服务器返回所以进入死机状态
    有没有那位大哥有好点的办法小弟谢谢了
      

  3.   

    我以为全世界只有我一个人用DELPHI做三层哈,
    这个问题我想可以用这个办法:
      想办法把客户端的文件保存为文件,在出错时调用本地的,在连接正常时再上传,大概思路如此,
    因为具体情况很复杂,
      

  4.   

    to xjwy(程序春秋) :
        谢谢回答!
        当然就是这样做的,本地还有脱机版和数据库,这些都不是问题,但是我就像处理上面描述的问题啊,关键是这种情况下没有错误发生啊,他只是在等待,难道有哪个地方设置的?
      

  5.   

    简单测试模型:
    三层架构
    客户端用datasnap.tSocketConnection连接
    服务器端写一个测试函数:
    function test();
    begin
        showmessage('test');
    end
    当客户端调用test()时,服务器端弹出消息test,此时,拔掉服务器端网线,过一段时间在接上,这样客户端就一直死机
    这是一个模拟网络中断的简单模式,请问这种问题是怎么解决的?弄了好久了,一直都不能够解决,望大哥们能给些建议
      

  6.   

    用修正版的SConnect,SktSvr 听说可以解决。
      

  7.   

    那个修正版的SConnect,SktSvr ?
    我换了7.0版本的,但一样……
      

  8.   

    关注,可能是Socket 里同不有timeout~~,但不知如何解决~
      

  9.   

    我觉得用SktSvr这种方式不是很好,我碰到SktSvr经常停止服务。
      

  10.   

    我对这个问题烦恼了1年多了,
    还有另外一个问题:三层架构中无法使用BLOB字段的内容。
    让我郁闷了很久。
      

  11.   

    这个我遇到过.可以这样解决要在客户端程序在提交数据后要有个时间限制比如最迟三十秒,如果三十秒后收不到程序提交回复停息那就是服务端死了.这可以用时间控件解决,反过来服务端如果要判断客户端也是一样.但是必须在客户端添加一个回调方法(接口)这在Delphi中很好实现.当然服务端也要有个时间限制.具体你可以参照JAVA中的一些心跳模式来解决.
      

  12.   

    哈哈:)那是当然的了,这是因为服务器端已经保存客户端连接ID号,他们一直在保持着握手状态。
    当网线断开时他们的握手状态就接受了,再要想连接就得重新建立了。解决的方法是在服务器端使用连接池对象,在客户端使用无状态对象,这可是三层体系中的精华呀。现在的html,asp,jsp,php都是无状态对象的,所以,即使你把开网线一会儿在连接页一样可以继续你
    的工作,哈哈.来吧小伙子,let's go .
      

  13.   

    服务端没事别showmessage
    raise到可以
      

  14.   

    三层架构中可以使用BLOB字段,不过要换驱动不要用微软的驱动
      

  15.   

    多谢大家的参与和热心指点
    几天不上,原来还有这么多解决啊:)to 123amw(怀旭):能否详细点说说用时间控件解决怎么弄呀?早也有人这么说,心跳信号等方法,我试过了,但不知道是不是我写的不对,时间控件中断不了我接口函数调用并使之抛出,多线程么?主要是怎么在调用死机时,进行检测,怎么设置,可以的话请给个例子,谢谢!to 84175971(cyg):
    解决的方法是在服务器端使用连接池对象,在客户端使用无状态对象,这可是三层体系中的精华呀。
    能否详细说说?让大家分享一下。其实,我一直坚信会有办法处理的,但苦于一直没找出有效的解决办法to JerreyAndMe(孰虞吾比):其实我现在就是在找抛出的办法,以前实现的过程根本就不会抛出,呵呵,我技术上的问题,向大家好好学习!to wing_er() :showmessage是模拟断线环境,没办法,我的东西是在网络比较恶劣的地方运行的,而且处理的业务有不会出错,就不能不考虑了to  ffanpeng(樊):怎么换驱动?
     
      

  16.   

    我做过简单的三层,三层架构中使用BLOB字段没有任何问题,但网络断线没有解决。
    总之,Delphi的MIDAS问题多多。
      

  17.   

    84175971(cyg)说的"解决的方法是在服务器端使用连接池对象,在客户端使用无状态对象,这可是三层体系中的精华呀。现在的html,asp,jsp,php都是无状态对象的,所以,即使你把开网线一会儿在连接页一样可以继续你的工作"
    怎么实现阿?
      

  18.   

    刚刚找书看了一下,明白了些服务器端使用连接池对象,在客户端使用无状态对象的方法
    但我还是有些不明白,我现在的案例如何结合
    我案例中用到两种情况:
    <1>客户端调用中间应用服务器的接口函数(参数包括一个OLEVariant类型为输入参数,一个Interger类型为返回参数),服务器接口函数通过对输入参数的处理,也就是逻辑处理,判断,计算,然后保存到数据库中,并将操作结果状态由返回参数返回给客户端调用者
    <2>也是客户端调用接口函数(参数包括操作类型),接口函数通过判断操作类型查询相关数据,通过DataSetProvider发布数据,客户端通过ClientDataSet获取数据
    案例中使用的都是两种模式,小弟才疏识浅,搞不太懂这种情况怎么处理接口函数调用时由于掉线而死机的情况,请高手们再指点指点
    上面几位提供了几种解决方法,但好像在这种情况下不太好解决,也许123amw(怀旭) 说得方法可以,但还是请再指点指点,不太会,呵呵
      

  19.   

    哈哈,我在来说两句,
    第一,在多层体系结构中,通讯的方式普遍使用的是DCOM 或 socket,在这两种方式中都是
          为windows而开发的,而又由于DCOM的配置是图形界面,很多编程的人都不知道windows的底
          层做了些什么,和到底使用了什么接口去实现,故产生了疑惑,
          随着开发的深入问题也就多,其实方法是有,但国内的这种太深入的书籍很少有。
          在Delphi中是用DCOM通讯协议制作服务器连接池的案例很少,大多都是为教学方便保持连接
          状态的,访问连接的数量越多,服务器占用的资源也越多,直到消耗完所有的资源。
    第二,在服务器端我本人强烈建议你使用unix系统,毕竟DCOM,socket有太多太多的病毒攻击了,
          在网络维护费上花了大量的财宝,在unix,windows系统中做多层体系结构的最好的通讯协议
          使用CORBA,事实也表明DCOM是在模仿它的功能,但无论如何模仿,都不可能达到CORBA的效果
          及功能,在稳定性上也大打折扣。
    第三,在java的应用中连接池的应用非常普遍,java+CORBA也有专门的介绍,也只有在Delphi方面
          可以在快速开发和跨平台上实现最优的结合,如果你这样做了,我想你的系统一定会非常坚固
          现在很多人都开始使用CORBA,一旦你开始使用这个通讯协议,你的问题一下子就解决了
    最后,如果你要开发非常强劲的坚固的体系结构,unix下的通讯必须知道,是程序员的必须走这条路
          如果你这样做了,你的薪水也会猛涨两倍。相信我,这是我自己经历。
      

  20.   

    建议:1、客户端采用短连接,需要调用服务器接口函数时连接服务器,得到返回值后断开连接,这样可以不用占用太多的网络资源,而且不用时时检测网络是否连接正常。
    2、连接、发送、接收等操作时,尽量用TRY。。EXCEPT,出现异常客户端主动断开连接,释放占有的资源。
    3、客户端在接收数据时,一定要设置超时,不要无限期等待。
    4、可以采用线程,这样在主线程里可以强行中止死掉的线程。
      

  21.   

    to 84175971(cyg):谢谢你的指点,可是我现在的环境还不具备这样的环境阿,这个问题已经是现场的问题,用unix肯定不行,当然,听从大哥的指点,以后有机会我会改,我也不想用Delphi来开发了,呵呵!偶非常想薪水向老兄那样连涨2倍,哈哈to windy2000():现在关键就是你说的第三点,设置不了超时等待,看来只好用线程了另:小弟的问题当然换一种协议等等方面会有很多办法,只是现在系统已经开发完了,单出现这种问题,小弟想找找比较简便的解决方法,目前先应付先,呵呵,比较大改动的其它的好办法就等小弟解决完这个现场问题,回家搞系统升级在向各位兄弟请教
      

  22.   

    现在能否有哪位大哥能提供一个例子
    就是关于多线程的,比如我上面描述的,一个线程调用接口函数,一个线程调用检测网络的函数
    当检测网络不通时,将调用接口函数的进程Kill掉
      

  23.   

    小弟没有编过多线程
    现在能否有哪位大哥能提供一个例子:
    一个线程调用接口函数,一个线程调用检测网络的函数
    当检测网络不通时,将调用接口函数的进程Kill掉
      

  24.   

    我现在也在做三层的,使用COM+ 跟 SOCKETCON 来获取数据。也建议在客户端连接、发送、接收等操作时,尽量用TRY。。EXCEPT,出现异常客户端主动断开连接,释放占有的资源。不过这里我想知道比如要上传几百条数据到服务器,大家是怎么解决的?
      

  25.   

    谢谢大家的参与,不过大家可能还是忽略了一点
    那就是调用接口函数时,除非客户端收到网络中断的信息(事实上根本就收不到),否则根本就不会出现异常而抛出,也就是客户端程序还是认为正常而继续运行的,所以,用try...except也没什么效果
    现在,我个人认为,这种情况也许只有使用多线程的方法,也就是检测网络的线程发现网络中断后,给出友好提示,然后中断调用远程接口函数的线程,只有这种方法成为可能了
    但是,小弟对多线程编程不太熟悉,而且,现在程序已经写完了,所以希望那位大虾能指点一下
    如何在调用接口函数时使用多线程,小弟感激不尽,比较着急,望能给个示意的例子,谢谢了!
      

  26.   

    关于多线程同步的问题: 多线程调用同一个函数(一个全局函数,不是对象的函数),函数内部的局部变量会不会受到影响
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=6577