客户端非正常断线,服务器的资源释放问题(200分)

  • 主题发起人 主题发起人 apiao
  • 开始时间 开始时间
这是一个有用但又是无聊的话题!好久以前我就想问这个问题了,但我知道结果无非
就是让人失望。没有最好的答案。
 
我不希望这次不了了之
 
看哪!问题终结者终于出现了!就是本人!(其实qiu_peking已经讲得很清楚了:-) )
在服务器端这样释放应用服务器联接:
IUnknown(IDispatch(IDatabroker(你的Corba/DCom数据模块)))._Release;
若是DCom数据模块,请将这个语句执行4次;若是Corba数据模块,则执行2次就行了。别问我为什么,我也不知道。:-)
至于怎么发现断掉的连接,大家自己想办法吧!这是个认真的菜鸟都可以解决的问题。
 
to sharejoy:
您能不能写得再细点。。[?]
 
project1_TLB.pas文件:
constructor Tcorbadatamodule1Skeleton.Create(const InstanceName: string;
const Impl: IUnknown);
begin
inherited;
inherited InitSkeleton('corbadatamodule1', InstanceName, 'IDL:project1/Icorbadatamodule1:1.0', tmMultiThreaded, True);
FIntf := Impl as Icorbadatamodule1;
FIntf.p_setskeleton(self);
end;

ucorbadatamodule1.pas文件:
Tcorbadatamodule1 = class(TCorbaDataModule, Icorbadatamodule1)
private
{ Private declarations }
b_clientexist:boolean;
iso_skeleton :ISkeletonObject;
...
end;


procedure Tcorbadatamodule1.p_setskeleton(const iu_skeleton:IUnknown);
begin
iso_skeleton :=iu_skeleton as ISkeletonObject;
end;

procedure Tcorbadatamodule1.timer1Timer(Sender: TObject);
begin
if b_clientexist then
b_clientexist :=false
else
if (iso_skeleton <>nil) then
repeat until iso_skeleton._release<=0;
end;

 
谢谢各位:
有DCOM的例子吗?
 
等我去看看怎么解决这个问题!!!
 
热切期盼中。。。。。。。。。。。。。。。。。
 
放心用吧,我已经把silicon搞出来了
IUnknown(self)._Release;
分全部归我,哈哈。
 
To MarkNew:
吊你!跑得走快,明明是我搞出来你的!你只是比我跑得快而已!
 
To silicon:
cao.还说,还不给500分给我,昨晚不是说好的吗?
 
为什么是CPU资源占到99%而不是内存?
 
是呀!我在NT中也有这种情况
 
好长时间没上来了。现在重新解释一下我的观点(请参考698965):
==============================================================================
如果是dcom,好办啊。可以限制阿adoquery的commandtimeout=30,然后再函数体加上
try
.....
(原函数)
setcomplet;
except
setabort;
raise;
end;
然后再检查一下可能走不到except中的语句,加判断:
if ....=false then

begin
...
setabort
raise;
end;
==============================================================================
以上是中间层的部分,当客户端掉线时 adoquery.commandtimeout会超时,程序会走到
except部分,触发setabort,服务器自动会rollback。raise 语句会把异常信息发送到客
户端。
在客户端一般这样调用:
try
dcom1.appserver.function();
except
on E:exceptiondo
begin
.....//在客户端显示异常信息: showmessage(e.message)
end;
end;

如果adoquery.commandtimeout=0,则永远不会触发超时异常,这种情况cpu占用率100%
但内存占用率正常。
另外 sharejoy 说_release 多次调用的方法。我觉得这种方法不好。我好像在那里看过
加'_'的这些函数都是delphi的内部调用函数,delphi的开发者们不希望程序员调用这些
函数。否则为什么要加‘_’呢?
你可以做个实验: 在中间层函数中加sleep(3000),留出3秒钟来去拔网线。然后再客户
端调中间层函数后拔掉网线,看结果如何。

 
我的多层并没有用到ADOQuery之类的
 
to silicon:
刚才有点遗漏:也可以设置adoconnection.commandtimeout。
你的例子好像是corba吧。或是用winsoket来连接的吧。这方面我没有仔细研究过。但是我觉得corba也好dcom也好,道理
应该是一样的(或者有类似之处)。我以前做n-tier 程序的时候也遇到过很多莫名其妙的
问题,后来发现都与程序代码有关。 现在我的机器上没装delphi6,有些地方可能写的
不太准确。
 
几天没上来,我的问题看来还有点普遍性
to LiZhongYu:
谢谢你的解答,现在问题的关键是RDM模块的资源释放问题。
可我并不是用的MTS模块,RDM中没有 setabort的方法。前面有介绍用_Release方法,可我试验
并不成功。有网友说COM能自动释放它的资源,好像并不是那么回事。
关于CPU资源占用到99%只是客户端在另外的机器上才表现出来,在同一台机器上并不高,只是
在强行退出服务器的时候才给你提示。。。
我希望大家能继续讨论。
否则用DCOM建立7*24的分层系统是不现实的

 
用心跳就可以解决了
 
各位:
这是谁提的问题????????
 
TO: 吴剑明
你是怎么心跳的?我心跳了再快都解决不好!

 
后退
顶部