什么是无状态对象?(200分)

  • 主题发起人 主题发起人 showmeZ
  • 开始时间 开始时间
S

showmeZ

Unregistered / Unconfirmed
GUEST, unregistred user!
在我的程序中封装一个现有的控件成一个COM+组件,对这个现有的控件的生成和初始化在这
个COM+组件的初始化时完成,整个应用系统通过调用COM+组件来使用被包容的现有的控件提
供服务。当一次服务完成时(一次服务需要调用COM+组件多次,相应的也会调用这个现有的
控件多次),通过调用COM+组件的一个函数来恢复这个被包容的现有的控件刚创建时的状态
,当请求下一次服务时,由客户端提供上一次服务的结果,COM+组件调用被包容的现有的控
件恢复上一次服务结束时的状态,继续服务,并在服务结束时,仍然通过调用COM+组件的一
个函数来恢复这个被包容的现有的控件刚创建时的状态。如此,不断循环。不知我的这个
COM+组件能否算无状态对象?还是我概念上有问题,框架不对?如果框架不对,又该如何
改正?其实对于无状态对象,我一直很迷惑,书上讲无状态对象在服务完毕后即释放资源,
不知这个服务指的仅仅是一次调用呢还是用于完成服务的一系列相关调用?如果只是一次
调用即释放资源,在MTS中的Rollback又如何实现,因为不保存状态。而在我的程序中是
通过把状态写回客户端,当客户端再次请求服务时提交状态来实现的。请大家指教,谢谢!
 
在COM+所謂無狀態(stateless), 即是當每一次COM的方法調用後, 這個COM即被釋放, 在下
一次方法呼叫時, 又會重新建立(目前COM+沒有做到Object pooling), 因為如此, 所以在
COM中所有的記錄的變量值, 在前後兩次調用時是不一樣的;
但是這要在你的COM call的最後調用SetComplete或SetAbort時, 此對象被在方法調用結
束後, 才會被釋放, 否則它跟一般的COM沒有兩樣, 都是State Full的;
 
多谢lorderic先生。
您的意思是否是说即使是无状态对象,如果在完成一个服务过程中的一系列方法调用中不
使用SetComplete或SetAbort,这个无状态对象内部的状态并不释放,也继续对下一次方法
调用有效,直到调用SetComplete或SetAbort,显式的释放资源为止?
如果是这样的话,是不是在我上面提到的这个程序里,应该在com+组件的Active方法中初
始化被com+组件所封装的现有的控件,在Deactive方法中释放这个现有的控件?
另外,如果我不显式的调用SetComplete或SetAbort释放资源,则资源的释放由COM+环境
控制?
请您指教。谢谢!
 
还有一个问题请教lorderic先生,您指出目前COM+沒有做到Object pooling,但是使用
Application center 2000能否支持Object pooling?不过这个产品好像Windows 2000
不带的,是不是需另外购买?请指教,谢谢!
 
我並沒有實際測試過Application center 2000, 不過據微軟公佈的消息, 是有的;
而此
產品的確是要花錢另外購買(微軟是營利事業, 並不是慈善事業), 當然它還有增加很多
其它功能, 如沒有同時間只有16個Transaction Context的限制, 自動更新多台Server的
COM Dll等...
其實是Stateless或Statefull,是完全由COM DLL自己來控制的, 如果DLL的方法中都沒有
呼叫SetComplete或SetAbort, 則表示在方法調完後, 並不希望將對象還給COM+, 那麼該
對象只有在用互端釋放所保留的接口後, 才會還給COM+
如果要做Statefull對象, 可以配套使用另外兩個方法: EanbleCommit跟DisableCommit,
用法與SetComplete與SetAbort一樣, 就相當於Transaction控制中的Commit Transaction跟
Rollback Transaction;
只是在EanbleCommit或DisableCommit後, Client並不釋放對象的
擁有權!!
 
非常感谢多谢lorderic先生。以后还请您多多指教。谢谢!
 
后退
顶部