用DELPHI的MIDAS开发三层程序,客户端利用DCOM连接方式与应用服务器联系,当正常运行过程中,突然断开客户端与应用服务器之间的网络。当网络恢复正常后,客户端重新进行连接工作,可是客户端和应用服务器之间进行数据交换总是出错,应用服务器不能正常工作。查看应用服务器所在的WIN2000操作系统的任务管理器,发现应用服务器存在于操作系统的进程中,采用强制结束进程,可是WIN2000总是提示“拒绝访问”。没办法,重新启动应用服务器所在的机器,这时候客户端调用应用服务器,一切恢复正常。这个问题很实际,因为在实际的应用中,不可能保证网络时刻都保持完好,所以希望大家能够给予帮助,解决这个问题!!!!!!谢谢,谢谢,谢谢!!!!!注:系统部署信息客户端:win98
应用服务器:win2000
数据库:oracle
部署在不同的三台机器上!!!!!

解决方案 »

  1.   

    当要结束系统的dllhost时会出现“拒绝访问”,你确定那个dllhost是你的?
    其它的没碰到过,不知。有空我试试。
      

  2.   

    不管是 DCOM or Socket 连接都会在非法断开网络时服务器都无法检查到客户机断线,也就是会有一个无效连接,DCOM 要过一个 Keep alive 时间才能得到通知。如果服务器是有状态的,那么在这段时间内就会有点不正常,没什么明确的办法解决此类问题,可能无状态服务器会正常,如果要保存客户信息就在任何操作之前送上客户 ID。
      

  3.   

    TO:comanch系统内所有的ClientDataSet的FetchOnDemand属性都是默认值TRUE,所以应用服务器应该是无状态的吧!!我希望能够在客户端断线后,应用服务器能够对该客户端上次成功调用应用服务器中的那个线程有所处理,因为在实际应用中,多个客户端同时工作,应用服务器同时为他们服务,不能因为一个客户端的断线影响其他客户端,所以关机重起机器是不现实的,该如何解决呢??????????
      

  4.   

    我也曾遇到过.
    其实加入多台app server效果会好些.
    但现在应用三层结构的公司还是较少.但这必定是趋势所在.
      

  5.   

    统内所有的ClientDataSet的FetchOnDemand属性都是默认值TRUE,所以应用服务器应该是无状态的吧!!我希望能够在客户端断线后,应用服务器能够对该客户端上次成功调用应用服务器中的那个线程有所处理,因为在实际应用中,多个客户端同时工作,应用服务器同时为他们服务,不能因为一个客户端的断线影响其他客户端,所以关机重起机器是不现实的,该如何解决呢?????????? 
    -----------------我觉的这种可能性不是很大,或是没有谁会这样认为,当客户端退出之后,那么它如果被检测到的话,它的所有资源应该放回Pooler里,以便于其它的客户来处理,如果没有检测到的话,再次上线,又如何进入到它的线程 or 进程?的确,DCOM默认每两分种内进行检测,Midas也默认为无状态的,还有,你所说的是应用程序服务器需要得启?那么,想知道你的应用程序服务器给的错误提示是什么?是系统级的?线程错误?进程错误还是别的?
      

  6.   

    基本上不会影响其它客户线程,DCOM 对像会在Keep alive后自动回收。影响其它线程的可能性不多,要不就是性 global 性的变量没处理好,要不就是内存回收得不正确(无效指针操作)我基本上不用 DCOM 连接, 而偏爱用 Socket
      

  7.   

    提个建议, 建立成 dll 形态的服务器性能最好
      

  8.   

    各位的答复对小弟来说受益匪浅,希望能够再和大家讨论一个问题,如下所述:
    系统部署还是上面的那样:客户端1:win98
    客户端2:win98
    应用服务器:win2000 (DCOM方式)
    数据库:oracle
    部署在不同的四台机器上!!!!!现在客户端1,客户端2连接到应用服务器,客户端1调用数据库端的一个存储过程,这个过程所处理的数据量很大,既有对表有写的操作,也有读的操作。在客户端1正在执行时,客户端2的程序却死在那里,就连点击程序界面的菜单都没有任何反应。当客户端1执行完毕后,客户端2又恢复了正常。为了进一步搞清楚问题所在,我们将应用服务器程序拷贝了一份到另外一台机器上,也就是说让客户端1,客户端2分别连接各自的应用服务器,重复前次的操作,发现客户端1,客户端2一切正常,互不影响各自的工作。所以,判断应该是应用服务器程序的问题,这里需要说明一点,当初写应用服务器的程序时,无论是DCOM,还是客户端数据模块,远程数据模块都采用的是默认属性,是无状态类型的,只是为了多个客户端能够共享一个应用服务器,将DCOM的handleshare属性设为了TRUE.另外,BDE的属性也都是默认属性。对于这个问题,始终不能明白应该如何处理,也不知道该如何对DOM的一些属性进行相应的合理设置。望大家给予提示,帮助,谢了!!!!!!!!!!!!
      

  9.   

    我做过几个这类程序,不过数据库是Microsoft SQL 7.0,数据量也很大,而且不仅仅是局域网使用,还供远程客户用调制解调器连接使用,DCOM都是使用默认值,没出现你说的这类问题。不知你用TDatabase元件没有,因为我看你提到BDE,恐怕问题出在:1、没有使用TDatabase元件,默认缺省的;2、用了TDatabase元件,但是将它放到远程数据模块中。如果使用BDE,正确的做法是必须使用TDatabase,并将它放在公共窗体上,如主窗体,千万不要放在远程数据模块中。请参考。
      

  10.   

    全部是地址出错..说不能为READ..KAO..这种错误都不知道是哪的..
      

  11.   

    用Ado好像没有这个问题,我就是这样的。