flyfaraway学习笔记之--COM+组件技术(一)
1、COM+相比COM,提供了:
(1)管理
(2)安全(基于角色)
(3)事务支持
(4)连接池
(5)松散耦合
(6)队列,消息,事件组件
(7)负载平衡
(8)共用和回收
2、COM+的实例化
COM是在CreateObject时直接实例化的,COM+是由COM+的代理(dllhost.exe)接管后实例化的
3、COM配置为具有事务能力的COM+步骤:
(1)MTX代码 (只做到此步,建立MTXAS.APPSERVER.1对象时,报OLE Error 0x80004005错误,COM无法实例化)
(2)通过《组件服务》配置为COM+应用程序 (只做到此步,仍然无法启动事务)
(3)在 <事务>页<事务支持>选项,选择 “支持”(对于单独的COM调用)或"必需"(对于父COM调用多个子COM)
4、COM+组件的状态性
(1)新建1个项目vfp_com.pjx
(2)加入4个prg文件
com1.prg
DEFINE CLASS com1 AS Session OLEPUBLIC
MyColor = "Green"
PROCEDURE SetColor(tcColor AS String)
this.MyColor =tcColor
ENDPROC
ENDDEFINE
com2.prg
DEFINE CLASS com2 AS Session OLEPUBLIC
MyColor = "Green"
PROCEDURE SetColor(tcColor AS String)
LOCAL oMtx,oContext
oMtx = CreateObject("MTXAS.APPSERVER.1")
oContext = oMtx.GetObjectContext()
this.MyColor =tcColor
oContext.SetComplete()
ENDPROC
ENDDEFINE
com3.prg
DEFINE CLASS com3 AS Session OLEPUBLIC
MyColor = "Green"
PROCEDURE SetColor(tcColor AS String)
LOCAL oMtx,oContext,oContextState
oMtx = CreateObject("MTXAS.APPSERVER.1")
oContext = oMtx.GetObjectContext()
oContextState = GETINTERFACE(oContext,"iContextState")
this.MyColor =tcColor
oContextState.SetMyTransactionVote(0)
ENDPROC
ENDDEFINE
com4.prg
DEFINE CLASS com4 AS Session OLEPUBLIC
MyColor = "Green"
PROCEDURE SetColor(tcColor AS String)
LOCAL oMtx,oContext,oContextState
oMtx = CreateObject("MTXAS.APPSERVER.1")
oContext = oMtx.GetObjectContext()
oContextState = GETINTERFACE(oContext,"iContextState")
this.MyColor =tcColor
oContextState.SetMyTransactionVote(0)
oContextState.SetDeactivateOnReturn(.T.)
ENDPROC
ENDDEFINE
(3)连编为MTDLL
(4)在《组建服务》管理中,新增一COM+应用程序,加入 vfp_com.dll,看到了4个com组件,设置com3、com4的事务支持为“必需”
(5)在vfp命令窗口中运行下列代码
clear
?"com1:"
oo=CREATEOBJECT("vfp_com.com1")
??oo.mycolor+" , "
oo.setcolor("Red")
??oo.mycolor
RELEASE oo
?"com2:"
oo=CREATEOBJECT("vfp_com.com2")
??oo.mycolor+" , "
oo.setcolor("Red")
??oo.mycolor
RELEASE oo
?"com3:"
oo=CREATEOBJECT("vfp_com.com3")
??oo.mycolor+" , "
oo.setcolor("Red")
??oo.mycolor
RELEASE oo
?"com4:"
oo=CREATEOBJECT("vfp_com.com4")
??oo.mycolor+" , "
oo.setcolor("Red")
??oo.mycolor
RELEASE oo
(6)结果为:
com1:Green , Red
com2:Green , Green
com3:Green , Red
com4:Green , Green
(7)结论:
com1:com1演示了传统COM组件,虽然加入到COM+中,由于没有加入MTS代码,仍然没有享用到COM+的特性
说明:传统COM的“有状态性”。
com2:com2演示了置于MTS下的COM组件,上下文对象的SetComplete()和SetAbort()方法执行后,COM实例立即变为"DeActivated"状态,而后面对实例的处理,COM+会重新创建实例
说明:置于MTS下的COM的“无状态性”(Stateless)
com3:com3演示了COM+组件的事务处理能力,SetMyTransactionVote交易表决方法,0=提交,1=回滚,表现了事务的一致性
说明:置于MTS下的COM的“无状态性”(Stateless);
事务性:SetMyTransactionVote方法只提交或回滚交易,表决之后COM实例还是"Activated"
com4:com4演示了COM+组件的事务和结束处理能力,SetDeactivateOnReturn设置结束位,.T.=结束,.F.=保持激活
说明:置于MTS下的COM的“无状态性”(Stateless);
事务性:SetMyTransactionVote方法只提交或回滚交易,表决之后COM实例还是"Activated"
结束:SetDeactivateOnReturn(.T.)后实例状态为"DeActivated",后面的对实例的操作会重新初始化。
5、到底该怎么做?
对于不进行数据更新的,比如:查询、计算、报表等用com1或com2
对于数据更新的,如单据的业务处理,用com4
浙公网安备 33010602011771号