S
Sachow
Unregistered / Unconfirmed
GUEST, unregistred user!
去年下半年做了一个系统,采用的是COM+技术,应用服务器用BDE + Oracle 8.1.6客户端连接Oracle 7.3.4数据库,现在遇到的问题是应用服务器组件一旦启动就再也无法停下来。
我们知道,在COM+组件服务中有一项选项,即“闲置关闭之前的时间”,我在其中只设了三分钟,如果组件的引用计数为零并达到3分钟时间,dllhost就会释放组件。但是现在组件总是得不到释放,其结果导致当组件运行到一定时间(比如两个星期)后,就会开始变得不稳定,直至最后无法服务。
导致组件不能释放的原因我估计是由于有客户端调用没有释放,但我的组件是由ASP调用的,在一个页面处理完成后,就会超出对象的作用范围,此引用计数就会撤消,因此应该不存在做为客户端的ASP没有释放引用计数的问题。我另外有一种用于处理报表的COM客户端程序,采用TSocketConnection连接服务器,但我在Borland Socket Server中设置了超时,当客户端闲置达到一定时间时主动断开客户端,因此也应该不是由于某些报表客户端程序没有关闭而导致组件不能释放。
那是什么原因导致组件不能释放呢?异常?
我注意到,当系统运行没有遇到异常发生的时候,是会自动释放的,但当遇到异常后,就会出现这个问题,难道是由于异常对象没有被释放导致的?那又该怎么处理异常为好呢?
在发生异常时,为了可以分析导致异常的原因,不能简单地用捕获异常的方式将异常信息屏蔽,而是要将异常信息传给客户端,从而使客户端界面上可以反映出异常信息来。我目前采用的是(CB代码,Delphi高手可以以Delphi的角度进行分析):
return Error(WideString(E.Message), IID_IiPAS_AppServer);
这是使用ATL的方式,在组件方法发生异常时将异常传递给调用者,是不是问题出在这里呢?
(先发100分,问题解决后再开个200分的贴以酬谢)
我们知道,在COM+组件服务中有一项选项,即“闲置关闭之前的时间”,我在其中只设了三分钟,如果组件的引用计数为零并达到3分钟时间,dllhost就会释放组件。但是现在组件总是得不到释放,其结果导致当组件运行到一定时间(比如两个星期)后,就会开始变得不稳定,直至最后无法服务。
导致组件不能释放的原因我估计是由于有客户端调用没有释放,但我的组件是由ASP调用的,在一个页面处理完成后,就会超出对象的作用范围,此引用计数就会撤消,因此应该不存在做为客户端的ASP没有释放引用计数的问题。我另外有一种用于处理报表的COM客户端程序,采用TSocketConnection连接服务器,但我在Borland Socket Server中设置了超时,当客户端闲置达到一定时间时主动断开客户端,因此也应该不是由于某些报表客户端程序没有关闭而导致组件不能释放。
那是什么原因导致组件不能释放呢?异常?
我注意到,当系统运行没有遇到异常发生的时候,是会自动释放的,但当遇到异常后,就会出现这个问题,难道是由于异常对象没有被释放导致的?那又该怎么处理异常为好呢?
在发生异常时,为了可以分析导致异常的原因,不能简单地用捕获异常的方式将异常信息屏蔽,而是要将异常信息传给客户端,从而使客户端界面上可以反映出异常信息来。我目前采用的是(CB代码,Delphi高手可以以Delphi的角度进行分析):
return Error(WideString(E.Message), IID_IiPAS_AppServer);
这是使用ATL的方式,在组件方法发生异常时将异常传递给调用者,是不是问题出在这里呢?
(先发100分,问题解决后再开个200分的贴以酬谢)